2010-09-28 22 views
9

Używam następujący Javascript czytać ciągów z pliku tekstowego i przetwarzać je z wyrażenia regularnegoJavaScript Regular Expression nie co drugi czas jest zwany

while (!textFile.AtEndOfStream) 
{ 
    currLine = textFile.ReadLine(); 
    match = re.exec(currLine); 
    do stuff with match 
} 

Mam problem jest to, że w każdym innym czasie re.exec nazywa się niepowodzeniem i zwraca null; więc pierwszy wiersz jest przetwarzany poprawnie, ale w drugim wierszu występuje wartość null, następnie trzeci wiersz działa, a czwarty wiersz ma wartość null.

mogę użyć następującego kodu, aby uzyskać wynik chcę

while (!textFile.AtEndOfStream) 
{ 
    currLine = textFile.ReadLine(); 
    match = re.exec(currLine); 
    if (match == null) match = re.exec(currLine); 
} 

ale to wydaje się trochę bolesnego kludge. Czy ktoś może mi powiedzieć, dlaczego tak się dzieje i co mogę zrobić, aby naprawić to poprawnie?

+0

Andy E ma właściwe rozwiązanie, ale w przypadku jesteś zainteresowany, możesz zmienić tę ostatnią linię do 'match = meczu || re.exec (currLine); ' – Skilldrick

+0

@Sililldrick: usunięto moje, ponieważ odpowiedź bobince była bardziej kompletna. Teraz ma właściwe rozwiązanie :-) –

Odpowiedz

21

Twój re jest definiowana z „globalnym” modyfikatora, np. coś jak /foo/g.

Kiedy RegExp ma charakter globalny, to zachowuje ukryte stan na przykład samego RegExp pamiętać ostatnie miejsce pasował. Przy następnym wyszukiwaniu będzie wyszukiwać z indeksu końca ostatniego meczu i znaleźć następny mecz z tego miejsca. Jeśli podajesz inny ciąg do tego, który minąłeś ostatni raz, da to wysoce nieprzewidywalne wyniki!

Podczas korzystania z wyrażeń regularnych w postaci g należy je wyczerpać, wywołując je wielokrotnie, aż do uzyskania null. Następnym razem, gdy go użyjesz, ponownie dopasujesz od początku łańcucha. Ewentualnie przed użyciem możesz jednoznacznie ustawić re.lastIndex na 0. Jeśli chcesz tylko przetestować istnienie jednego dopasowania, jak w tym przykładzie, najprostszym jest po prostu nie używać g.

interfejsy JS RegExp jest jednym z najbardziej skomplikowane, źle zaprojektowanych części języka. (I to jest JavaScript, więc to mówi dużo).

+1

+1, skasował moje na rzecz tego. Chciałem rozszerzyć swoją kopalnię, ale odjechałem na boczny tor :-) –

+0

Dzięki za wspaniałą odpowiedź Bobka. Usunąłem g i działa teraz idealnie. – Pandelon

3

wyrażenia regularne Javascript zachować pewien stan pomiędzy egzekucji i jesteś prawdopodobnie spada w tej pułapce.

zawsze używać funkcji String.match i nigdy nie został ugryziony:

while (!textFile.AtEndOfStream) 
{ 
    match = textFile.ReadLine().match (re); 
    do stuff with match 
} 
Powiązane problemy