Chciałem Ci wytłumaczyć o co chodzi, a nie podać rozwiązanie, bo to bardzo powszechny problem w wyrażeniach regularnych, z tą zachłannością. Jak go zrozumiesz, to potem zawsze będziesz potrafił stwierdzić, czy przypadkiem znowu się na niego nie nadziałeś. Problem z ukośnikami jest zaś równie powszechny w językach nie posiadających literałów wyrażeń regularnych, np. w PHP. JavaScript posiada te literały, ale posiada też konstruktor RegExp -- przydatny w niektórych przypadkach, ale zwykle tylko sprawiający problemy.
Szczerze mówiąc nie do końca ogarniam, co chcesz zrobić w tej pętli. Doprawdy, jest to pętla nieskończona :). exec nie działa tu tak, jak myślisz, tj. nie startuje od re.lastIndex. Zawsze startuje od 0, więc pętla kręci się w kółko. Ale możesz to obejść.
Po prostu na końcu pętli zmień str tak, by zaczynał się od odpowiedniego miejsca. Możesz użyć lastIndex, ale lepiej będzie użyć rightContext -- we własności tej przechowywany jest tekst, który jeszcze nie został przemielony przez wyrażenie regularne (czyli tekst, który znajduje się "po prawej" od "wskaźnika", stąd nazwa rightContext). Czyli możesz na końcu pętli zrobić tak:
str = myRe.rightContext;
Inny sposób, to zmuszenie exec, by jednak korzystało z lastIndex i startowało zawsze od niego. To odrobinę niebezpieczne, jeśli się nie uważa (np. czasem trzeba ręcznie ustawić lastIndex = 0 żeby zresetować wyrażenie regularne). Można włączyć tę funkcjonalność, włączając w wyrażeniu regularnym flagę g. Flaga ta wpływa różnie na różne metody i to też może powodować pewne problemy, jeśli się o tym zapomni. Ale na exec wpływa tak, że dopasowanie rozpoczyna się od lastIndex.
Flagę g ustawia się tak:
Kopiuj
new RegExp("tresc_wyrazenia", "g")
Po prostu drugi parametr konstuktora RegExp to flagi. Jakbyś chciał postawić jeszcze flagę i (ang. case-insensitive -- jeśli jest włączona, wielkość znaków nie jest brana pod uwagę), to musiałbyś zrobić tak:
Kopiuj
new RegExp("tresc_wyrazenia", "gi")
Lub korzystając z literału wyrażenia regularnego (polecam i opisuję dalej):
/tresc_wyrazenia/gi
(flagi wypisuje się zaraz za zamykającym ukośnikiem; nie ma tu żadnych cudzysłowów etc.).
Co do tego, że chcesz wyciągnąć jedynie fragment wyrażenia... To też bardzo, bardzo częsty problem, więc czytaj uważnie ;).
exec zwraca, jak zauważyłeś, tablicę. W pierwszym elemencie tablicy (czyli o indeksie [0], bo w tablicach liczymy od 0) znajduje się całe dopasowane wyrażenie. Natomiast w kolejnych znajdują się fragmenty tekstu dopasowane do kolejnych tzw. grup dopasowania (ang. capturing group). Takie grupy oznaczane są w wyrażeniu regularnym nawiasami okrągłymi. Ty tez masz taką grupę, choć może jeszcze o tym nie wiesz.
Przypuśćmy, że masz takie wyrażenie regularne:
Kopiuj
var re = /a(bc)[0-9]+(.+)/
Wyrażenie to oznacza: najpierw litera a, potem b i c, następnie przynajmniej jedna cyfra, a potem przynajmniej jeden dowolny znak. W wyrażeniu tym masz dwie grupy dopasowania. Pierwsza to (bc), a druga to (.+). To tak jakby fragmenty wyrażenia regularnego.
Teraz wyobraź sobie, że robisz:
Kopiuj
var str = 'abc123lalala5';
var m = re.exec(str);
Tekst w zmiennej str pasuje do wyrażenia regularnego. exec zwraca zaś tablicę z dopasowaniami, którą podstawiamy do zmiennej m (nazwa m jak matches, czyli dopasowania). m[0] to cały dopasowany tekst, czyli "abc123lalala5". m[1] to tekst dopasowany przez grupę pierwszą, a m[2] -- drugą. Grupa pierwsza to było (bc) i dopasowała pogrubiony fragment tekstu:
abc123lalala5
Czyli m[1] będzie równe "bc". Grupa druga to było (.+) i dopasowała ten fragment tekstu:
abc123lalala5
Więc m[2] == "lalala5"
Teraz zauważ, że i Ty masz w swoim wyrażeniu jedną grupę. Ilekroć użyjesz nawiasów, tworzona jest grupa. Dopasowuje Ci ona dokładnie to, o co Ci chodzi: ten fragment pomiędzy nawiasami [ i ]. To grupa pierwsza, użyj więc myArray[1] by dobrać się do dopasowanego przez nią fragmentu tekstu!
PS. Jeszcze o numeracji grup. Bywa, że masz zagnieżdżone grupy, czyli "nawias w nawiasie", coś jak takie wyrażenie regularne:
blabla(abc([0-9]+)xxx(.+))
Tutaj numeracja jest taka, że zaczyna się od najbardziej zewnętrznych nawiasów. Czyli:
-grupa [1] to ten duuży nawias: (abc([0-9]+)xxx(.+))
-grupa [2] to pierwszy z tych wewnętrznych: ([0-9]+)
-grupa [3] to drugi z wewnętrznych (.+)