2013-06-09 10 views
5

http://jsfiddle.net/bpt33/W jaki sposób "g" w metodzie testowej RegExp działa alternatywnie?

var t = ""; 

var a = ["atom-required","atom-label","atom-data-type","atom-regex"]; 

var r = /atom\-(label|required|regex|data\-type|class|is\-valid|field\-value|error)/i; 

function test(a, r){ 
    for(var i = 0; i<a.length; i++){ 
     t += a[i] + " => " + r.test(a[i]) + "<br/>"; 
    } 
} 

test(a, r); 

t += "<br/>"; 

a = ["atom-required","atom-label","atom-data-type","atom-regex"]; 

var r = /atom\-(label|required|regex|data\-type|class|is\-valid|field\-value|error)/gi; 

test(a, r); 

$("#results").get(0).innerHTML = t; 

gdy wartość g nie jest określona, ​​że ​​działa poprawnie,

atom-required => true 
atom-label => true 
atom-data-type => true 
atom-regex => true 

gdy G jest określona, ​​to działa alternatywnie

atom-required => true 
atom-label => false 
atom-data-type => true 
atom-regex => false 
+0

Na marginesie nie ma potrzeby ucieczki od '-' - jest to wyjątkowe w klasie postaci. – georg

+0

możliwy duplikat [Dlaczego RegExp z globalną flagą w JavaScript daje złe wyniki?] (Http://stackoverflow.com/questions/1520800/why-regexp-with-global-flag-in-javascript-give-wrong-results) – Bergi

Odpowiedz

11

Ponieważ z modyfikatorem g, tego wyrażenia staje się stanowy i wznawia następne wyszukiwanie w indeksie po ostatnim dopasowaniu.

Gdy nie znaleziono pasującego elementu, resetuje się.

Punkt obserwacyjny można obserwować, korzystając z właściwości .lastIndex.

r.lastIndex; // 0 or some higher index 

Można zresetować ręcznie, ustawiając tę ​​właściwość na 0.

r.lastIndex = 0 
+0

"Gdy nie znaleziono pasującego, resetuje się" i zwraca wartość false – thejh

+0

@thejh: Tak, metoda 'test()' w naturalny sposób zwraca wartość 'false', gdy nie znaleziono żadnego dopasowania. –

+1

Właściwie to robi bardzo mało (blisko zera, powiedziałbym) sens używając modyfikatora '/ g' w wzorzec, który ma być użyty w' .test' - chyba że naprawdę chcesz, aby regex się posunął. Ale to jest BARDZO rzadkie, delikatnie mówiąc. – raina77ow

Powiązane problemy