Regex старается избегать «не совпадающих» и всегда совпадающих - PullRequest
0 голосов
/ 11 января 2019

У меня есть регулярное выражение для проверки сообщений, связанных с вопросами доставки (поставки). Я использую регулярное выражение \b(problem(s|)|issue(s|)) (([^\n \.]*? ){1,3}?)(suppl(y|ies)|parcel|deliver(y|))\b, где (([^\n \.]*? ){0,3}?) действует как окно из 1–3 слов

Это соответствует следующему тексту:

  1. никогда не было проблем с поставкой доставка или обслуживание

  2. никогда не было проблемы с доставкой

  3. слишком много проблем с получением моих расходных материалов

Проблема в том, что первые 2 текста имеют предшествующий never, который я хочу обработать.

Я попытался использовать отрицательный прогноз и использовал следующие изменения в своем регулярном выражении \b(?!never)((?:[^\n \.]+? ){2,2}?)(problem(s|)|issue(s|)) (([^\n \.]*? ){1,3}?)(suppl(y|ies)|parcel|deliver(y|))\b, которое не соответствует первому тексту, но соответствует второму и третьему текстам

Регулярное выражение \b(?!never)((?:[^\n \.]+? ){3,3}?)(problem(s|)|issue(s|)) (([^\n \.]*? ){1,3}?)(suppl(y|ies)|parcel|deliver(y|))\b соответствует 1-му и 3-му и не соответствует 2-му тексту.

После объединения этих 2 регулярных выражений \b(?!never)((?:[^\n \.]+? ){2,3}?)(problem(s|)|issue(s|)) (([^\n \.]*? ){1,3}?)(suppl(y|ies)|parcel|deliver(y|))\b все 3 текста совпадают.

Таким образом, в основном, когда never является вторым словом перед исходным соответствием, регулярное выражение занимает окно из 3 слов и совпадений, а когда never является третьим словом перед исходным соответствием, регулярное выражение принимает окно с 2 и спички.

Матчи:

  1. никогда не было проблем с поставкой доставка или обслуживание

  2. никогда не было проблем с доставкой

  3. слишком много проблем с доставкой моих принадлежностей

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

Это общее поведение регулярного выражения?

Кроме того, есть ли способ решить эту проблему?

Спасибо.

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