Dlaczego od true
do false
;Dlaczego RegEx.test zmienia wynik w kolejnych połączeniach?
var r = /e/gi;
r.test('e'); // true
r.test('e'); // false
a następnie kontynuować przełączanie true
, false
, true
, false
......
Dlaczego od true
do false
;Dlaczego RegEx.test zmienia wynik w kolejnych połączeniach?
var r = /e/gi;
r.test('e'); // true
r.test('e'); // false
a następnie kontynuować przełączanie true
, false
, true
, false
......
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:
- Jeśli
lastIndex
jest większa niż długość napisu,test()
iexec()
zawiodą, wtedylastIndex
jest ustawiony na 0.- 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 odlastIndex
.- 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 ilastIndex
jest na 0.- 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.