Регулярно повторяет регулярные выражения, не заканчивая поиском соответствия - PullRequest
0 голосов
/ 19 мая 2019

Мне нужно найти подходящие позиции, я пробовал с

function myFunction() {
  var myvar_thru_textbox="u?"

  var ptrn = new RegExp(myvar_thru_textbox, "gim");

  var match;

  while ((match = ptrn.exec("color colour")) != null) {
    console.log(JSON.stringify(match));   
  }

}

Этот код выдает бесконечный вывод со строкой ""

Когда шаблон меняется на "ou?"это дает правильный вывод, почему?символ уходит в бесконечность, если ему предшествует один символ?

Я ожидал произвести "" или "u" только тогда, когда "u?"используется регулярное выражение.

Ответы [ 2 ]

3 голосов
/ 19 мая 2019

Согласно документации ,

JavaScript-объекты RegExp сохраняют состояние, если у них установлены глобальные или фиксированные флаги (например, /foo/g или /foo/y).Они хранят lastIndex из предыдущего совпадения.

...

Если совпадение выполнено успешно, метод exec () возвращает массив и обновляет свойство lastIndex регулярного выражения.объект.

Теперь представьте, что происходит на первой итерации.Регулярное выражение находит совпадение нулевой ширины в индексе 0, поэтому оно устанавливает lastIndex в 0. Затем на второй итерации он начинает поиск с 0, где находит другое совпадение нулевой ширины, поэтому он устанавливает lastIndex в 0снова.И цикл продолжается.

Поэтому вы должны поместить туда оператор if, чтобы проверить, соответствует ли совпадение нулевой ширине.Если это так, увеличьте последний индекс, чтобы он больше не совпадал.

function myFunction() {
  var ptrn = new RegExp("u?", "gim");

  var match;
  var i = 0;

  while ((match = ptrn.exec("color colour")) != null) {
    console.log(JSON.stringify(match));
    if (match.index == ptrn.lastIndex) {
      ptrn.lastIndex++;
    }

  }

}
myFunction()
0 голосов
/ 19 мая 2019

? означает «ноль или один».u? означает «совпадение для одного экземпляра u или одного экземпляра ничего».Поэтому неудивительно, что u? соответствует вашей строке бесконечно много раз.Полагаю, я бы этого не предсказал, но это не вызывает тревоги.

Когда вы изменяете свое регулярное выражение на ou?, это означает, что " требуют * o, за которым может следоватьu».Это не означает «найти ноль или одну ou комбинацию».В вашей строке два o s, что означает, что она будет совпадать дважды.

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