ホームページ  >  記事  >  Java  >  正規表現は、再帰やグループのバランシングを行わずに、入れ子になった括弧を照合できますか?

正規表現は、再帰やグループのバランシングを行わずに、入れ子になった括弧を照合できますか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-25 02:37:02441ブラウズ

Can Regex Match Nested Brackets Without Recursion or Balancing Groups?

再帰やグループのバランスをとらずに入れ子になった括弧を一致させる

課題:
次のような正規表現を使用できます。 Java の java.util.regex では、再帰やグループのバランスをとることなく、任意にネストされた括弧に一致しますか?

解決策:
はい、前方参照を使用することで可能です:

(?=\()(?:(?=.*?\((?!.*?)(.*\)(?!.*).*))(?=.*?\)(?!.*?)(.*)).)+?.*?(?=)[^(]*(?=$)

仕組み:
この式は、複数の先読みと前方参照で構成され、これらが連携してネストされた括弧のグループを識別します。

  • (? =() は、次の文字が開き括弧であることを保証します。
  • (?:...) ?.*?(?=...): 文字列を反復処理する非キャプチャ グループ。
  • (?=.*?((?!.*?1): 先読みして、既に一致したグループ (1 でキャプチャされた) の一部ではない次の左括弧を見つけます。
  • (.*)(?!.*2).*): 文字列の残りの部分をキャプチャし、少なくとも 1 つの追加の閉じ括弧と一致します。
  • (?=.*?)(?!.*?2 ): 先読みして、すでに一致したグループの一部ではない次の閉じ括弧を検索します (2 でキャプチャ)。
  • .*?(?=1): 見つかった最後に見つかった開き括弧まで一致します。 .
  • [^(]*(?=2$): 最後に見つかった閉じ括弧まで一致し、それらの間に開き括弧が存在しないことを確認します。

例:
次の文字列は 3 つのネストされたグループと一致します:

(F(i(r(s)t))) ((S)(e)((c)(o))(n)d) (((((((Third)))))))

内部グループの一致:
内部グループと一致するには、キャプチャ グループを追加できます。式の最後まで:

(?=\()(?=((?:(?=.*?\((?!.*?)(.*\)(?!.*).*))(?=.*?\)(?!.*?)(.*)).)+?.*?(?=)[^(]*(?=$)))

以上が正規表現は、再帰やグループのバランシングを行わずに、入れ子になった括弧を照合できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。