2012-01-18 9 views

Odpowiedz

24

Aby obejść ten problem, można usunąć flagę g lub zresetować lastIndex jak w

var reg = /a/g; 
console.log(reg.test("a")); 
reg.lastIndex = 0; 
console.log(reg.test("a")); 

Powstaje problem, ponieważ test opiera się exec który wygląda na więcej meczów Po pierwsze, jeśli przeszły ten sam ciąg i flaga g jest obecna.

15.10.6.3RegExp.prototype.test(string) # Ⓣ Ⓡ

Następujące kroki są podejmowane:

  1. Niech mecz być wynikiem oceny algorytmu RegExp.prototype.exec (15.10.6.2) po tym RegExp obiektu przy użyciu ciąg jako argument.
  2. Jeśli pasuje do, to nie jest null, następnie zwraca true; w przeciwnym razie zwróci false.

Kluczową częścią exec jest krok 6 15.10.6.2:

6. Niech globalny być wynikiem wywołanie [[Pobierz]] Metoda wewnętrznej R z argumentem "globalny".
7. Jeśli globalne jest fałszywy, to niech i = 0.

Kiedy i nie jest resetowany do 0, następnie exec (a więc test) nie zacząć szukać na początku łańcucha.

Jest to przydatne dla exec ponieważ można pętla obsłużyć każdy mecz:

var myRegex = /o/g; 
var myString = "fooo"; 
for (var match; match = myRegex.exec(myString);) { 
    alert(match + " at " + myRegex.lastIndex); 
} 

ale oczywiście to nie jest tak przydatne dla test.

+0

Co oznacza, że ​​powinienem ustawić lastIndex na 0, prawda? – NStal

+0

+1 dobre wytłumaczenie, nie wiedziałem o tym. –

+0

@NStal, Tak, ustawienie opcji 'lastIndex' na 0 przed testowaniem spowoduje obejście problemu. –

2

Zazwyczaj test jest wybierany w celu sprawdzenia, czy jakiś wzorzec pasuje w ogóle, ale globalna flaga pozwala ci przechodzić przez ciąg, aby policzyć dopasowania lub, jak exec, zrobić coś z każdym ostatnimIndeksem. Innym zastosowaniem jest ustawienie ostatniego indeksu rx przed wykonaniem testu, aby ignorować dopasowania przed jakimś indeksem znaków.

var count=0, rx=/\s+/g, rx.lastIndex=100; 
while(rx.test(string))count++; 
Powiązane problemy