JavaScript литерал Regex с/g, используемым многократно

У меня есть странная проблема, работающая с функцией Regexp.exec JavaScript. При назывании нескольких временем функция на новом (я предполагаю...) объекты RegExp, это работает одно время каждые два. Я не добираюсь почему вообще!

Вот немного примера цикла, но он делает то же самое при использовании одно время в функции и вызове многократно.

for (var i = 0; i < 5; ++i) {
  console.log(i, (/(b)/g).exec('abc'));
}

> 0 ["b", "b"]
> 1 null
> 2 ["b", "b"]
> 3 null
> 4 ["b", "b"]

При удалении/g это возвращается к нормальному.

for (var i = 0; i < 5; ++i) {
  console.log(i, (/(b)/).exec('abc'));
}             /* no g ^ */

> 0 ["b", "b"]
> 1 ["b", "b"]
> 2 ["b", "b"]
> 3 ["b", "b"]
> 4 ["b", "b"]

Я предполагаю, что существует оптимизация, сохраняя объект RegExp, но это кажется странным.

Это поведение является тем же на Chrome 4 и Firefox 3.6, однако это работает (I) ожидаемый в IE8. Я полагаю, что это предназначается, но я не могу найти логику там, возможно, Вы будете в состоянии помочь мне!

Спасибо

17
задан Svante 26 January 2010 в 20:25
поделиться

3 ответа

/ г не предназначен Для работы на простую соответствие :

/ G позволяет «глобальному» совпадению. При использовании Установите () [) метод () , укажите этот модификатор, чтобы заменить все совпадения, а не только первый.

Я полагаю, что внутренне JavaScript удерживает соответствие после захвата, поэтому он сможет возобновить сопоставление и, следовательно, NULL возвращается с B , происходит только один раз в теме. Сравнить:

for (var i = 0; i < 5; ++i) {
  console.log(i +'    ' + (/(b+)/g).exec("abbcb"));
}

Возвращает:

0 bb,bb
1 b,b
2 null
3 bb,bb
4 b,b
16
ответ дан 30 November 2019 в 11:52
поделиться

Если вы вообще повторно используете одно и то же регулярное выражение, выберите его из петли и явно сбросьте его:

var pattern = /(b)/g;
for (var i = 0; i < 5; ++i) {
  pattern.lastIndex = 0;
  console.log(i + ' ' + pattern.exec("abc"));
}
18
ответ дан 30 November 2019 в 11:52
поделиться

Спасибо :)

Я нашел интересный побочный эффект, можно сделать статическую переменную (в смысле С, глобальную, но видимую только из функции) без замыкания!

   function test () {
     var static = /a/g;
     if ('count' in static) {
       static.count++;
     } else {
       static.count = 1;
     }
     console.log(static.count);
   }

   for (var i = 0; i < 5; ++i) { test(); }
   1
   2
   3
   4
   5

(Я делаю новый ответ, потому что мы не можем поместить код в комментарий)

2
ответ дан 30 November 2019 в 11:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: