Как регулярное выражение может соответствовать всему после группы 1, если шаблон группы 1 снова не появится в той же строке? - PullRequest
0 голосов
/ 01 апреля 2020

У меня проблема с пониманием того, как я могу захватить все после необязательного префикса, если только этот префикс не отображается снова. Было бы неплохо, чтобы тэг [FFFFFF] соответствовал началу, поскольку группа 1 является необязательной дополнительной группой.

Я новичок-я sh для регулярных выражений, и мне нравится regex101.com сайт, но это, кажется, выше моего уровня понимания.

Выражение:

(\[[0-9a-fA-F]{6}\])?(.*)

Образец текста

[00B800][!] Green - [004DB8] Blue does not match!!

[FFFFff][!] White

[e60000][!] Red

123456

Test string, another test abcdef

Это результат, который я пытаюсь получить.

enter image description here

Ссылка

https://regex101.com/r/z3CbHm/2/

1 Ответ

1 голос
/ 01 апреля 2020

Вы можете использовать 2 группы захвата, делая первую группу необязательной.

Затем для второй группы сопоставляйте, пока не увидите следующее вхождение шаблона \[[0-9a-fA-F]{6}\] или конец строки.

(\[[0-9a-fA-F]{6}\])?(.+?)(?=\[[0-9a-fA-F]{6}\]|$)

Regex demo

Если вы хотите опустить возможные начальные пробельные символы для второй группы:

(\[[0-9a-fA-F]{6}\])?(?:[^\S\r\n]*(.+?))(?=\[[0-9a-fA-F]{6}\]|$)

Это будет соответствовать

  • (\[[0-9a-fA-F]{6}\])? Соответствует шаблону в необязательном порядке группа 1
  • (?: Группа без захвата
    • [^\S\r\n]* Соответствие 0+ вхождений символ пробела, кроме новой строки
    • (.+?) Захват группа 2 , совпадение с 1+ появлением любого символа, кроме новой строки
  • ) Закрыть группа
  • (?= положительный взгляд, утверждаем, что справа
    • \[[0-9a-fA-F]{6}\] соответствует шаблону
    • | или
    • $ Конец строки
  • ) Закрыть взгляд

Regex demo

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