Как опционально захватить значение Regex? - PullRequest
0 голосов
/ 28 марта 2020

Я знаю, что вопрос задавался раньше. Но я не могу найти решение этой проблемы:

Вот тестовые строки

value: value1, Do not include this
value: value2

Вот мое регулярное выражение: value: (.*)(?:, Do not include this)?

Результат должен захватить

value1
value2

Но вместо этого он фиксирует это

value1, Do not include this
value2

[РЕДАКТИРОВАТЬ] На основе комментариев и ответов. Позвольте мне уточнить.

, если это тестовая строка

value: value1, Do not include this
value: value1, test,
value: man, this is bad!!, Do not include this

Тогда полученные значения должны быть следующими:

value1
value1, test, test,
man, this is bad!!

1 Ответ

1 голос
/ 28 марта 2020
value: (.*)(?:, Do not include this)?
       ---- ~~~~~~~~~~~~~~~~~~~~~~~~
        A              B

Проблема с вашим выражением состоит в том, что части A разрешено совпадать со всей строкой, а части B необязательно. Движок регулярных выражений, встретив А, просто перейдет к концу строки, с которой он в настоящее время сопоставляется, и поглотит все символы на пути. Затем, сопоставив A, он перейдет к части B выражения, увидев, что оно не может быть сопоставлено (поскольку вся строка уже была использована) и что это необязательно, и, поскольку это конец выражения, остановится эта попытка и объявить совпадение успешным.

Один из способов предотвратить это - сделать ленивую часть A, заставляя выражение соответствовать всей строке, используя привязку конца строки. Например:

value: (.*?)(?:, Do not include this)?$

См. demo .

Вы также можете сделать части A и B настолько отличными друг от друга, что вам не придется беспокоиться о одно совпадение вместо другого. Если применимо, это позволит вам сохранить жадный квантификатор для части A. Например:

value: ([^,]*)(?:, Do not include this)?

Какой способ больше подходит для ваших нужд, зависит от состава строк, с которыми вы сопоставляете.

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