単純な後読みでは、これはどのような長さでも不可能です。Java 正規表現フレーバーでは、有限長の後読みのみが許可されます (つまり、実行できますが、実行できませ(?<=x{2,10})
ん(?<=x*)
)。
paragraph
問題を「単語が の前の 100 文字に含まれてはならない」に減らすことができれば(a)
、それは機能します。
(?<!paragraph.{0,100})\([a-z]\)
無制限の距離が本当に必要で、正規表現が柔軟で、入力の先頭から開始して 1 つだけに一致(ref)
する場合は、負の先読み (有限である必要はありません) で目的の動作を近似できます。
^(?!.*?paragraph.*?\([a-z]\)).*?\([a-z]\)
一致しますが、一致test test (a)
しませんparagraph test (a)
。
これはトリックですが、維持するのが非常に複雑になる可能性があり、欠点があり (マッチングが 1 回しかないなど)、最終的にはおそらく問題を解決するためのより良い方法があります。たとえば、それらすべて([a-z])
を照合してから、文字列に が含まれているかどうかを確認しparagraph
、その位置の後にあるすべての一致を除外できます。
PS: の代わりにor (正規表現全体で大文字と小文字が区別されない場合) または(のみ大文字と小文字が区別されない場合) のPattern.compile("[aA][bB][cC]")
使用を検討してください。Pattern.compile("abc", Pattern.CASE_INSENSISIVE)
Pattern.compile("(?i)abc")
Pattern.compile("(?i:abc)dEf")
abc