ホームページ >Java >&#&チュートリアル >正規表現で再帰またはバランシンググループを使用せずにネストされた括弧を照合する方法は?

正規表現で再帰またはバランシンググループを使用せずにネストされた括弧を照合する方法は?

Susan Sarandon
Susan Sarandonオリジナル
2024-10-24 11:59:021039ブラウズ

How to Match Nested Brackets Without Recursion or Balancing Groups in Regex?

再帰またはバランシング グループを使用せずにネストされた括弧を照合する

再帰またはバランシング グループを使用せずにネストされた括弧を照合するという問題は、次のような正規表現フレーバーを使用するときに発生します。これらの機能。通常、正規表現はネストされた構造の処理には適していないため、このタスクには独特の課題があります。

前方参照を使用したパズルの解決

この問題の解決策これには、前方参照を使用して、ネストされた括弧内の部分文字列をキャプチャすることが含まれます。次の正規表現はこれを実現します。

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

式の分解

この複雑な式は、ネストされた括弧のグループと一致するように連携する複数のコンポーネントで構成されます。

  • 左括弧の肯定先読み: (?=()。これは、存在する場合にのみ '(' と一致し、消費します。
  • グループ反復: (?:...) ?。このグループは、複数のバランスのとれたグループと一致する文字列を反復処理します。
  • ネストされた左括弧の識別: (?=.*?((? !.*?1)。これは、キャプチャされた部分文字列 1 が前にない次の '(' と一致します。これにより、同じ '(' が再び一致することはなくなります。
  • キャプチャ括弧内の部分文字列: (.*)(?!.*2).*。これは、一致した「(」と次の「)」の間の、キャプチャされた部分文字列 2 が続かない文字列の部分をキャプチャします。
  • 入れ子になった右括弧の識別: (?=.*?)(?!.*?2)。これは、キャプチャされた部分文字列が前にない次の ')' と一致します。 2、再び非冗長マッチングを確保します。
  • 部分文字列の残りをキャプチャしています: (.*)。これは、一致した ')' の後と次の '(' または文字列の終わりまでの文字列の残りの部分をキャプチャします。
  • 一致および消費する文字: 。これは 1 つの文字を消費します。
  • 最終検証: .*?(?=1)[^(]*(?=2$)。これにより、最後の検証が行われていることを確認して検証します。一致する '(' と ')' はバランスの取れたグループを形成します。

これらのコンポーネントを利用することにより、式は文字列の終わりに達するまでの反復ごとにネストされた括弧のグループと一致します。

追加の注意

ここで提供されるソリューションは、JavaScript などの前方参照をサポートしない正規表現のフレーバー向けに設計されており、この手法を直接適用することはできません。 >

以上が正規表現で再帰またはバランシンググループを使用せずにネストされた括弧を照合する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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