Я пытаюсь построить регулярное выражение примерно так:
[match-word] ... [exclude-specific-word] ... [match-word]
Кажется, это работает с негативным прогнозом, но я сталкиваюсь с проблемой, когда у меня есть такой случай:
[match-word] ... [exclude-specific-word] ... [match-word] ... [excluded word appears again]
Я хочу, чтобы приведенное выше предложение совпадало, но отрицательный просмотр вперед между первым и вторым совпадающим словом «перетекает», поэтому второе слово никогда не совпадет.
Давайте рассмотрим практический пример.
Я не хочу сопоставлять каждое предложение, в котором есть слово «i» и слово «пирог», но не слово «ненависть» между этими двумя словами. У меня есть три предложения:
i sure like eating pie, but i love donuts <- Want to match this
i sure like eating pie, but i hate donuts <- Want to match this
i sure hate eating pie, but i like donuts <- Don't want to match this
У меня есть это регулярное выражение:
^i(?!.*hate).*pie - have removed the word boundaries for clarity, original is: ^i\b(?!.*\bhate\b).*\bpie\b
Что соответствует первому предложению, но не второму, потому что отрицательный просмотр вперед сканирует всю строку.
Есть ли способ ограничить негативное прогнозирование, чтобы оно было удовлетворено, если оно столкнется с «пирогом» до того, как столкнется с «ненавистью»?
Примечание: в моей реализации могут быть другие термины, следующие за этим регулярным выражением (оно построено динамически из поисковой системы грамматики), например:
^i(?!.*hate).*pie.*donuts
В настоящее время я использую JRegex, но, возможно, при необходимости могу переключиться на JDK Regex.
Обновление: я забыл кое-что упомянуть в своем первоначальном вопросе:
Вполне возможно, что «отрицательная конструкция» существует дальше в предложении, и я действительно хочу сопоставить предложение, если это возможно, даже если «отрицательная» конструкция существует дальше.
Чтобы уточнить, посмотрите на эти предложения:
i sure like eating pie, but i love donuts <- Want to match this
i sure like eating pie, but i hate donuts <- Want to match this
i sure hate eating pie, but i like donuts <- Don't want to match this
i sure like eating pie, but i like donuts and i hate making pie <- Do want to match this
Ответ Роба отлично подходит для этого дополнительного ограничения, поэтому я принимаю это.