2011-02-09 8 views
12

prosty skrypt testowy:Regex w JavaScripcie nie co drugi czas z identycznym wejściu

<script type="text/javascript"> 
    var reg = new RegExp('#([a-f0-9]{3})$', 'gi'); 
    for (var i = 0; i < 10; i++) { 
     console.log(reg.exec('#fff')); 
    } 
</script> 

wyjścia konsoli:

["#fff", "fff"] 
null 
["#fff", "fff"] 
null 
["#fff", "fff"] 
null 
["#fff", "fff"] 
null 
["#fff", "fff"] 
null 

Dlaczego każdy inny wynik NULL gdy wejście pozostaje na stałym poziomie?

+0

$ zakotwicza wzór do końca wiersza. Bez tego coś podobnego do '#fff blah blah blah' również będzie pasować. Oczywiście, na tym stanie, regex będzie pasował do 'blah blah blah # fff', ponieważ nie jest zakotwiczone na początku linii z'^' –

Odpowiedz

29

Podczas korzystania z globalnych flag, regex staje Oznacza to, że używa zmiennej licznika do śledzenia gdzie znaleziono ostatni mecz. Zamiast dopasowywania od początku za każdym razem, lepkie regex będzie faktycznie zbierane tam, gdzie zakończył się ostatni mecz. Licznik ten zresetuje się ponownie do 0 (na początku), jeśli cały mecz się nie powiedzie (

W twoim przypadku moja sugestia polegałaby na zrzuceniu flagi g.

Aby uzyskać więcej informacji: RegExp @ MDC

+1

Nie wiedziałem, że ... żyjesz i uczysz się: D –

3

Twój problem jest "gi" w drugim argumencie, po prostu usuwa go i przetestowane na konsoli Chrome: „lepki”

var reg = new RegExp('#([a-f0-9]{3})$'); 
9

Matt odpowiedział dlaczego. Chciałem tylko dodać, że widać to poprzez sprawdzenie wartości lastIndex na obiekcie RegExp przed i po wywołaniu exec

var reg = new RegExp('#([a-f0-9]{3})$', 'gi'); 
for (var i = 0; i < 10; i++) { 
    console.log(reg.lastIndex); 
    console.log(reg.exec('#fff')); 
    console.log(reg.lastIndex); 
} 

wyjście jest

0 
["#fff", "fff"] 
4 

4 
null 
0 

0 
["#fff", "fff"] 
4 

4 
null 
0 

0 
["#fff", "fff"] 
4 

4 
null 
0 

0 
["#fff", "fff"] 
4 

4 
null 
0 

0 
["#fff", "fff"] 
4 

4 
null 
0 

undefined 

wykazując, że na każdym innym iteracji w pętli, dopasowanie do wyrażenia regularnego rozpoczyna się od miejsca zakończenia lastIndex. Możesz ustawić lastIndex na 0 przed każdym połączeniem exec lub całkowicie zrzucić flagę.

1

znalazłem to w sieci ...

Wywołanie funkcji exec() zmienia również własność RegExp obiektu lastIndex.
Przechowuje indeks w temacie, od którego rozpocznie się następna próba dopasowania.
Można zmodyfikować tę wartość, aby zmienić pozycję początkową kolejnego połączenia na exec().

opisać zachowanie wskazuje, że obiekt RegExp ma stan, który jest modyfikowany przez wywołanie metody exec().

Myślę, że musisz zmodyfikować właściwość lastindex przed ponownym uruchomieniem metody exec.
czytaj więcej tutaj: Javascript Regexp Object

Powiązane problemy