ホームページ >バックエンド開発 >C++ >正規表現はかっこのバランスを効果的にとることができますか?

正規表現はかっこのバランスを効果的にとることができますか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2025-01-16 14:48:11901ブラウズ

Can Regular Expressions Effectively Balance Parentheses?

正規表現を使用して釣り括弧を検証する

正規表現は強力ですが、正規表現のみを使用してかっこのバランスを完全に調整することは本質的に困難です。 ただし、特定のコンテキスト内でバランスのかっこを効果的に検証する正規表現を作成できます。 次のアプローチはメソッドを示しています:

括弧検証の正規表現:

<code>func([a-zA-Z_][a-zA-Z0-9_]*) # Function name

\(                      # Opening parenthesis
    (?:                 
    [^()]               # Match any character except parentheses
    |
    (?<open> \( )       # Match opening parenthesis, add to 'open' stack
    |
    (?<-open> \) )      # Match closing parenthesis, remove from 'open' stack
    )+
    (?(open)(?!))       # Fails if 'open' stack is not empty
\)                      # Closing parenthesis</code>

仕組み:

この正規表現は、バランシング グループを活用しています (多くの正規表現エンジンで利用可能ですが、すべてではありません)。

  • 名前付きキャプチャ グループ: (?<open> ( ) および (?<-open> ) ) は名前付きキャプチャ グループを使用します。 (?<open> ...) は、一致する開き括弧を「open」という名前のスタックに追加します。 (?<-open> ...) は、一致する閉じ括弧を「開いた」スタックから削除します。
  • 条件チェック: (?(open)(?!)) は条件式です。 「開いている」スタックが空かどうかを確認します。空でない場合 (括弧のバランスが崩れている場合)、一致全体が失敗します。

例:

指定された入力文字列: "test -> funcPow((3),2) * (9 1)"

正規表現は、"funcPow((3),2)" をバランスの取れた括弧表現として正しく識別します。 外側の括弧のバランスが崩れているため、 とは一致しません"funcPow((3),2) * (9 1)

制限事項:

この正規表現は、(

で定義された) 関数呼び出しに直接関連する括弧に対してのみ機能します。 括弧内のネストされた関数呼び出しは処理されません。 複雑な入れ子構造間で真に堅牢な括弧のバランスをとるには、通常、非正規表現ベースのアプローチ (スタックベースのアルゴリズムなど) が必要です。func([a-zA-Z_][a-zA-Z0-9_]*)

以上が正規表現はかっこのバランスを効果的にとることができますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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