
現在、文字列に「bar」が含まれているが、「foo」が先行していない場合に一致する正規表現があります。
(?<!foo)bar
文字列に「bar」が含まれているが、「foo」および(オプションで)追加の文字が先行していない場合に一致するように正規表現を変更したいと思います。
たとえば、「footestbar」は、bar の前に「foo」があり、その後に「test」が続くため一致しません。
正規表現では否定後読み内で量指定子の使用が許可されていないため、これを実現する方法が見つかりません。したがって、次の操作を行うことはできません。
(?<!foo.*)bar
別のアプローチはありますか?
アップデート:
正規表現のフレーバーは再2現在、ドキュメントを確認中ですが、一目見ただけで次の点に気づきました。
(?<!re) after text not matching re (NOT SUPPORTED)
したがって、このソリューションでは、否定的な後読みを使用することはできません (ドキュメントを正しく解釈している場合)。
答え1
修正投稿
したがって、一部の (ほとんどの?) 正規表現エンジンは固定長の後読みでしか動作しないようです。ただし、可変長の先読みは問題なく受け入れるようです。これがどのようなユースケースなのか、またどの程度実行可能かはわかりませんが、1 つのアイデアとしては、文字列を逆にして、次のように使用することが考えられます。
rab(?!.*oof)
もちろん、これはばかげているように見えますし、どのように使用するのか、どれほど役立つのかはわかりません。私の Regex の経験のほとんどは .NET を使用しており、ほとんどの場合、後読みは必要ありませんでした。これは単なるアイデアです。
元の投稿 - 特定の正規表現エンジンでのみ動作します (.NET を使用してテスト済み)
次の正規表現を試してください:
(?<!foo(?:.*)?)bar
これにより、同じネガティブルックの背後に、オプションの非キャプチャグループが追加されます。