あなたはそれについて正しい方法で考えています。しかし残念なことに、後読みは通常固定長です。唯一の大きな例外は、.NET の正規表現エンジンです。これにより、後読み内で反復量指定子を使用できます。ただし、先読みではなく、否定的な後読みのみが必要なためです。あなたのためのハックがあります。文字列を逆にして、一致を試みます。
/rab(?!.{0,10}oof)/
次に、一致の結果を逆にするか、一致する位置を文字列の長さから差し引きます。
あなたが与えた正規表現から、これは実際に必要なものの単純化されたバージョンにすぎないと思います。もちろん、bar
それ自体が複雑なパターンである場合は、それを正しく反転させる方法についてさらに検討する必要があります。
パターンが可変長の後読みと先読みの両方を必要とする場合、これを解決するのが難しくなることに注意してください。また、あなたの場合、後読みを複数の可変長のものに分解することも可能です(どちら+
も使用しないため*
):
/(?<!foo)(?<!foo.)(?<!foo.{2})(?<!foo.{3})(?<!foo.{4})(?<!foo.{5})(?<!foo.{6})(?<!foo.{7})(?<!foo.{8})(?<!foo.{9})(?<!foo.{10})bar/
でも、それだけじゃないですよね?