Как кодировать регулярное выражение для общего символа между двумя соответствующими шаблонами? - PullRequest
3 голосов
/ 12 февраля 2020

Я собираюсь найти все подстроки 'aa' в 'caaab'. Итак, я использовал следующее регулярное выражение.

/aa/g

Используя приведенное выражение, я ожидаю, что метод JavaScript match возвращает два соответствующих шаблона. Как вы можете видеть, средний, общий «a» вызывает два «aa» паттерна! Тем не менее, он просто возвращает первый. В чем проблема с Regex, и как я могу это исправить?

let foundArray=d.match(/aa/g);

Ответы [ 2 ]

4 голосов
/ 12 февраля 2020

Вот один из способов подойти к этому. Сначала мы можем записать длину входной строки для последующего использования. Затем выполните глобальную замену регулярного выражения a(?=a) пустой строкой. Один за другим это заменит каждое вхождение подстроки aa во входных данных. Затем мы можем сравнить длину выходных данных с входными данными, чтобы выяснить, сколько раз aa произошло.

var input = "caaab";
var sLen = input.length;
var output = input.replace(/a(?=a)/g, "");
var eLen = output.length;
console.log("There were " + (sLen - eLen) + " occurrences of aa in the input");

Обратите внимание, что трудности, с которыми вы сталкиваетесь, связаны с поведением движка регулярных выражений JavaScript. Если вы замените aa, он будет потреблять все, и поэтому может потреблять первую букву a следующего последовательного aa совпадения. Использование a(?=a) решает эту проблему, потому что запрос (?=a) не потребляет следующий a.

1 голос
/ 12 февраля 2020

Используйте заглядывание

Как уже упоминалось в комментарии, вот как регулярные выражения рассчитаны на работу:

это работает точно так, как и должно; как только он потребляет символ, он проходит мимо него

Совпадения не перекрываются, это не ограничение js, просто как работают регулярные выражения .

Способ обойти это - использовать совпадение нулевой длины , то есть упреждающий просмотр или упущение

Существующий ответ Тима уже делает это, но может быть упрощено следующим образом:

match = "caaab".match(/a(?=a)/g);
console.log(match);

Это поиск a, за которым следует еще a (который не возвращается как часть матча). Технически это так:

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