Регулярное выражение: отрицательный прогноз между двумя совпадениями

I'm пытаюсь построить регулярное выражение примерно так:

[match-word] ... [exclude-specific-word] ... [match-word]

Это, кажется, работает с отрицательным просмотром вперед, но я сталкиваюсь с проблемой, когда у меня есть такой случай:

[match-word] ... [exclude-specific-word] ... [match-word] ... [excluded word appears again]

Я хочу, чтобы приведенное выше предложение совпадало, но отрицательный просмотр вперед между первым и вторым совпавшим словом «перетекает», так что второе слово никогда не совпадет.

L давайте посмотрим на практический пример.

Я не хочу сопоставлять каждое предложение, в котором есть слово «i» и слово «pie», но не слово «hate» между этими двумя словами. У меня есть эти три предложения:

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

Ответ роба идеально подходит для этого дополнительного ограничения, так что я принимаю его.

8
задан Alexander Malfait 24 March 2012 в 10:26
поделиться