Необычный javascript результат Regex, объяснение пожалуйста! - PullRequest
1 голос
/ 17 ноября 2010

Я занимаюсь разработкой в ​​VS2005 и у меня на странице есть код JS. Я установил точку останова во время определенного цикла, где у меня возникла проблема. Вот мой маленький разговор с IDE -

? ind
/d/g
? ind.test("d")
true
? ind.test("dtn")
false
? ind.test("dtn")
true
? ind.test("dtn")
false
? ind.test("dtn")
true
? ind.test("dtn")
false

Почему тест чередуется между истиной и ложью? ind мой RegEx - я установил его так:

case "datetime" : ind = new RegExp("d","g");break;

UPDATE

Итак, я решил свою проблему, изменив декларацию на

ind = /d/;

т.е. без глобального модификатора. Я полагаю, что

ind = RegExp("d");

будет работать одинаково хорошо.

Хотя вопрос остается. Почему глобальный модификатор вызывал test чередование между истиной и ложью?

Ответы [ 2 ]

5 голосов
/ 17 ноября 2010

Как с exec (или в комбинации с это), тест вызывается несколько раз на то же глобальное регулярное выражение Экземпляр продвинется мимо предыдущий матч.

Источник: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/RegExp/test

Так что именно здесь происходит, так как вы используете глобальный параметр для регулярного выражения, он продолжит поиск строки после того, как найдет совпадение.

ind.test("d")

Это найдет d в позиции 0 .

ind.test("d")

Теперь будет выполняться поиск d, начиная с позиция 1 , но, поскольку это конец строки, он ничего не найдет, поэтому возвращает false .

Мы можем использовать свойство lastIndex регулярного выражения, чтобы доказать, что:

ind.lastIndex
>> 0
ind.test("d")
>> true
ind.lastIndex
>> 1
ind.test("d")
>> false
3 голосов
/ 17 ноября 2010

Вызов re.test(str) эквивалентен re.exec(str) != null (см. спецификацию RegExp.prototype.test(string)).

И при повторном вызове exec для регулярного выражения с модификатором g поиск начинается не в начале строки, а в том месте, где был предыдущий поиск закончено (lastIndex, инициализировано 0):

Если ваше регулярное выражение использует флаг "g", вы можете использовать метод exec несколько раз, чтобы найти последовательные совпадения в одной и той же строке. При этом поиск начинается с подстроки str, указанной в свойстве lastIndex регулярного выражения (test также будет продвигать свойство lastIndex).

Вот почему вы получаете этот странный результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...