2015-03-07 11 views

Odpowiedz

6

jego ponieważ z flagą g. Zaczyna zapamiętywać ostatni indeks meczu, a kiedy następnym razem zrobisz r.test, zaczyna się od tego indeksu. Dlatego jest wyświetlany na zmianę między true i false. Spróbuj tego

var r = /e/gi; 
console.log(r.test('e')); 
# true 
console.log(r.lastIndex); 
# 1 
console.log(r.test('e')); 
# false 
console.log(r.lastIndex); 
# 0 
console.log(r.test('e')); 
# true 
console.log(r.lastIndex); 
# 1 
console.log(r.test('e')); 
# false 

Cytowanie MDN dokumentacji na RegExp.lastIndex,

The lastIndex jest do odczytu/zapisu właściwości Integer wyrażeń regularnych, które określa indeks w których można rozpocząć następny mecz. ...

Ta właściwość jest ustawiona tylko wtedy, gdy wyrażenie regularne używa flagi "g" do wskazania wyszukiwania globalnego. Stosuje się następujące zasady:

  1. Jeśli lastIndex jest większa niż długość napisu, test() i exec() zawiodą, wtedy lastIndex jest ustawiony na 0.
  2. Jeśli lastIndex jest równa długości łańcucha, a jeśli wyrażenie regularne dopasowuje pusty ciąg znaków, a następnie wyrażenie regularne dopasowuje dane wejściowe zaczynając od lastIndex.
  3. Jeśli lastIndex jest równa długości łańcucha, a jeśli wyrażenie regularne nie pasuje do łańcucha pustego, a następnie regularne wprowadzanie niedopasowania ekspresyjnych i lastIndex jest na 0.
  4. przeciwnym razie lastIndex jest ustawiony na następna pozycja po ostatnim meczu.

Pogrubiony tekst powyżej odpowiada zachowaniom, które zaobserwowałeś. Po pierwszym meczu, e, lastIndex ustawiono na 1, aby wskazać indeks, z którego należy wypróbować następny mecz. Zgodnie z trzecim punktem opisanym powyżej, ponieważ wartość lastIndex jest równa długości łańcucha, a wyrażenie regularne nie pasuje do pustego łańcucha, zwraca false i resetuje lastIndex na 0.

Powiązane problemy