У меня есть регулярное выражение для проверки сообщений, связанных с вопросами доставки (поставки).
Я использую регулярное выражение \b(problem(s|)|issue(s|)) (([^\n \.]*? ){1,3}?)(suppl(y|ies)|parcel|deliver(y|))\b
, где (([^\n \.]*? ){0,3}?)
действует как окно из 1–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 и спички.
Матчи:
никогда не было проблем с поставкой доставка или обслуживание
никогда не было проблем с доставкой
слишком много проблем с доставкой моих принадлежностей
Как будто регулярное выражение пытается всегда совпадать, где только возможно.
Ссылка на пример
Это общее поведение регулярного выражения?
Кроме того, есть ли способ решить эту проблему?
Спасибо.