Я пытаюсь построить регулярное выражение примерно так:
[match-word] ... [exclude-specific-word] ... [match-word]
Кажется, это работает с негативным прогнозом, но у меня возникает проблема, когда у меня есть такой случай:
[match-word] ... [exclude-specific-word] ... [match-word] ... [excluded word appears again]
Я хочу, чтобы вышеприведенное предложение совпадало, но отрицательное упущение между первым и вторым подобранным словом «выплескивается», поэтому второе слово никогда не сопоставляется.
Давайте посмотрим на практический пример.
Я не хочу сопоставлять каждое предложение, в котором есть слово «я» и слово «пирог», но не слово «ненависть» между этими двумя словами.
У меня есть три предложения:
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
Ответ Роба прекрасно работает для этого дополнительного ограничения, поэтому я принимаю его.