Регулярное исключение Javascript, сопоставляющее строку один раз каждые две попытки в Chrome и Firefox - PullRequest
1 голос
/ 19 августа 2011

У меня есть следующее регулярное выражение в JavaScript:

var the_regexp = /^\/([!\/]*)\/?(\w*)\??([\=|\w]*)\/?$/gi

Это консоль Firefox и Chrome, она находит совпадение для строки "/ d" раз в две попытки.

>the_regexp
/^\/([!\/]*)\/?(\w*)\??([\=|\w]*)\/?$/gi
>the_regexp.exec("/d")
null
>the_regexp.exec("/d")
["/d", "", "d", ""]
>the_regexp.exec("/d")
null
>the_regexp.exec("/d")
["/d", "", "d", ""]

Может кто-нибудь объяснить это поведение?

Ответы [ 2 ]

4 голосов
/ 19 августа 2011

Документы MDN :

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

Таким образом, когда у вашего регулярного выражения есть флаг g, и вы используете метод exec один раз, при следующем запуске он будет искать совпадение после первого совпадения. В этом случае его нет: exec вернет ноль, а свойство lastIndex будет сброшено.

Например:

var str = "abcdef";
//         ^ starting index for search is here
var regex = /ab/g;

regex.exec(str);
// str: "abcdef"
//         ^ starting index for search is now here

regex.exec(str);
// no match found from starting index, return null and reset
// str: "abcdef"
//       ^ starting index reset

Прошу прощения за мои плохие формулировки и т. Д., Я не совсем проснулся ...

0 голосов
/ 19 августа 2011

Возможно, вы захотите убрать флаг g из вашего регулярного выражения в зависимости от того, чего вы хотите достичь.Кроме того, эти пустые группы захвата выглядят ненужными.

РЕДАКТИРОВАТЬ: похоже реанимация бить меня;)

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