ホームページ >バックエンド開発 >C++ >正規表現を使用して文字列内のバランスのとれた括弧のみに一致させるにはどうすればよいですか?

正規表現を使用して文字列内のバランスのとれた括弧のみに一致させるにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2025-01-16 15:27:10891ブラウズ

How Can I Use Regular Expressions to Match Only Balanced Parentheses in a String?

正規表現のヒント: バランスの取れた括弧の完全な一致

プログラミングの世界では、コードの整合性を確保するためにバランスの取れた括弧が重要です。正規表現 (RegEx) は、バランスの取れた括弧のペアを識別および検証するための強力なメカニズムを提供します。ただし、平衡括弧に正確に一致する正規表現を作成するのは複雑な作業となる場合があります。

次の正規表現について考えてみましょう:

<code>func([a-zA-Z_][a-zA-Z0-9_]*)\(.*\)</code>

この式は、文字列「funcPow((3),2) * (9 1)」と一致するように設計されています。理想的には、「funcPow((3),2)」のみを選択する必要がありますが、現在は最後の閉じ括弧まですべてがキャプチャされるため、一致が期待どおりに行われません。

バランスマッチングのソリューション:

この問題を解決するには、正規表現の力を利用して削除をキャプチャする、より高度な実装が必要です。次の変更された式は、バランスの取れた括弧の一致を実現する方法を示しています:

<code>var r = new Regex(@"
    func([a-zA-Z_][a-zA-Z0-9_]*) # 函数名

    \(                      # 开括号
        (?:                 
        [^()]               # 匹配所有非括号字符
        |
        (?<open> \( )       # 匹配'(', 并捕获到名为'open'的组中
        |
        (?<-open> \) )      # 匹配')', 并删除'open'组中的相应捕获
        )+
        (?(open)(?!))       # 如果'open'堆栈不为空,则匹配失败

    \)                      # 闭括号
", RegexOptions.IgnorePatternWhitespace);</code>

バランスのとれた一致サブグループの説明:

バランスの取れた括弧の鍵は、次のサブグループにあります:

  • (? ( ): 開始括弧を「open」という名前付きキャプチャ グループにキャプチャします。
  • (?<-open> ) ): 右括弧と一致し、対応する「開いている」キャプチャを削除します。

キャプチャ句がありません: (?(open)(?!))

この条件式は、「開いている」キャプチャが空でない場合の安全メカニズムとして使用されます。 「開いた」キャプチャがまだ存在する場合、つまり一致しない開き括弧がある場合、式の一致は失敗します。

これらの手法を組み合わせることで、バランス括弧に正確に一致し、目的の一致を返す正規表現を作成できます。

<code>"funcPow((3),2)"</code>

これらの正規表現の高度な機能をマスターすると、バランス括弧などの複雑な文字列処理の課題をエレガントかつ効率的に解決できます。

以上が正規表現を使用して文字列内のバランスのとれた括弧のみに一致させるにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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