Регулярное выражение соответствует любому слову, содержащему последовательность, только один раз - PullRequest
0 голосов
/ 03 февраля 2019

Мне нужно регулярное выражение, которое соответствует любому слову, содержащему, скажем, последовательность «ab» ровно один раз.Таким образом, оно должно соответствовать этим:

  • aaaabaaa
  • ab
  • мерзость

, а не этим:

  • что-то
  • abab
  • bacba

С моим текущим регулярным выражением \w*ab\w* я получаю весь первый список, а также второй второй список какВы можете увидеть в фрагменте ниже.Как я могу указать, что он должен совпадать только в том случае, если он содержит ровно один «ab»?

let text = "aaaabaaa ab abomination something abab bacba";

console.log(text.match(/\w*ab\w*/ig));

Я некоторое время искал и не нашел решения, но если это какой-то дубликат, пожалуйста, дайте мне знать, и я удалю вопрос.

1 Ответ

0 голосов
/ 03 февраля 2019

Вы можете использовать регулярное выражение, начинающееся с границы слова (\b), а затем иметь отрицательный прогноз, который позволит избежать совпадения слов, имеющих две непоследовательные ab последовательности букв:

\b(?!\w*ab\w*ab)\w*ab\w*

См. regex demo

Подробности

  • \b - граница слова
  • (?!\w*ab\w*ab) - отрицательный взглядэто не соответствует, если непосредственно справа от текущего местоположения есть два повторения символов 0+ слов и ab
  • \w* - 0+ слов символов
  • ab - ab подстрока
  • \w* - 0+ слов символов.

Обратите внимание, что в некоторых случаях вам нужно сопоставлять только буквы, и тогда это будет иметь смыслизменить \w (соответствует буквам, цифрам и подчеркиванию, и может совпадать больше, чем это, если он поддерживает Unicode) на [^\W\d_], [[:alpha:]], [a-zA-Z], \p{L} и т. д. в зависимости от того, что вам нужнои двигатель регулярных выражений.

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