регулярное выражение соответствует чему-либо до и после слова, если оно существует - PullRequest
1 голос
/ 30 марта 2020

У меня есть подобные предложения

word1 word2 abc word3 word4
word1 word2 word3 word4

И я хочу получить совпадения:

  1. все до abc
  2. abc или ничего
  3. все после abc

Мне нужно 3 разных совпадения, потому что $ 1 и $ 3 будут скопированы в вывод как есть, а $ 2 должен быть изменен. Я ожидаю, что 2 доллара не всегда будут там, как и 3 доллара).

Мое текущее решение - это следующее

(.+?(?=abc))(abc)?(.*)

Это не работает, если abc не является частью приговор. Как я могу express "сопоставить все до того слова, если оно существует" с регулярным выражением?

PS Я использую JS (не уверен, что это уместно)

1 Ответ

1 голос
/ 30 марта 2020

Вы можете использовать

^(.*?)(?:(abc)(.*))?$

Если строка может иметь разрывы строк, используйте

^([\w\W]*?)(?:(abc)([\w\W]*))?$

См. Демонстрационную версию regex . В JS, [\w\W] можно заменить на [^] для соответствия любым символам, включая символы разрыва строки.

Подробности

  • ^ - начало строки
  • (.*?) - Группа 1: любой ноль или более символов, кроме символов разрыва строки, как можно меньше
  • (?:(abc)(.*))? - необязательный жадный шаблон, соответствующий один или ноль раз:
    • (abc) - группа 2: abc
    • (.*) - группа 3: любые ноль или более символов, кроме символов разрыва строки, максимально возможное количество
  • $ - конец строки.

Поскольку первый шаблон группы не является жадным, он будет расширяться от начала строки до первого появления необязательного не - захват шаблона группы (если имеется) или конца строки, и если есть abc, вторая и третья группы будут заполнены, иначе вся строка попадет в группу 1.

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