私は次のような正規表現を作成しようとしています:
[match-word] ... [exclude-specific-word] ... [match-word]
これはネガティブな先読みで機能するようですが、次のような場合に問題が発生します。
[match-word] ... [exclude-specific-word] ... [match-word] ... [excluded word appears again]
上記の文を一致させたいのですが、最初に一致した単語と2番目に一致した単語の間の負の先読みが「こぼれ」、2番目の単語が一致することはありません。
実際の例を見てみましょう。
「i」という単語と「pie」という単語が含まれるすべての文を一致させたくはありませんが、これら2つの単語の間に「hate」という単語を含めることはできません。私はこれらの3つの文を持っています:
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
これは最初の文と一致しますが、2番目の文とは一致しません。これは、負の先読みが文字列全体をスキャンするためです。
ネガティブな先読みを制限して、「憎しみ」に遭遇する前に「パイ」に遭遇した場合に満足するようにする方法はありますか?
注:私の実装では、この正規表現の後に他の用語が存在する可能性があります(文法検索エンジンから動的に構築されます)。たとえば、次のようになります。
^i(?!.*hate).*pie.*donuts
現在JRegexを使用していますが、必要に応じてJDKRegexに切り替えることができます。
更新:最初の質問で何かを言及するのを忘れました:
「ネガティブコンストラクト」が文のさらに上に存在する可能性があります。「ネガティブ」コンストラクトがさらに上に存在する場合でも、可能であれば文と一致させたいと思います。
明確にするために、これらの文を見てください:
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
robの答えは、この追加の制約に対して完全に機能するので、私はそれを受け入れています。