Захватите все, что находится перед известным шаблоном, которого здесь может не быть - PullRequest
0 голосов
/ 24 марта 2019

С учетом этих примеров строк:

str_1 = 'This will be captured (unwanted static pattern)'
str_2 = 'This wil also be captured'

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

out_1 = 'This will be captured'
out_2 = 'This wil also be captured'

Я пробовал до сих пор (с использованием регистра без учета регистра):

(.*)\s+(?:\(unwanted static pattern\))?$

Но она не захватит первую группу, когда шаблон отсутствует.

Мой точный вопрос: как мы распространяем '*' '+' или '?'в целом

Ответы [ 2 ]

2 голосов
/ 24 марта 2019

Вы хотите, чтобы матч был максимально коротким. Измените (.*) на (.*?). Вы также захотите переместить \s+ внутри необязательного суффикса (в противном случае требуется, чтобы совпадение заканчивалось до непустой последовательности пробелов).

Демо: https://ideone.com/195NIk

Это может показаться парадоксальным, пока вы не поймете, что мы по-прежнему имеем в виду «самое короткое совпадение , которое все равно позволит сопоставить общее регулярное выражение». Так что, когда необязательный суффикс отсутствует, мы сопоставляем до конца; и когда он там, мы предпочитаем совпадение, которое не проходит до конца строки.

0 голосов
/ 24 марта 2019

Если вы уверены, что в первой группе скобок не будет, вы можете попробовать ([^\(]*)(?:\s+\(unwanted static pattern\))?$ и позаботиться о пробеле.

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