首頁 > 後端開發 > C++ > 如何使用正規表示式僅匹配字串中平衡的括號?

如何使用正規表示式僅匹配字串中平衡的括號?

Linda Hamilton
發布: 2025-01-16 15:27:10
原創
836 人瀏覽過

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)(?!))

此條件表達式用作安全機制,以防 "open" 捕獲不為空。如果 "open" 捕獲仍然存在,這表示存在未匹配的開括號,則表達式匹配失敗。

透過結合這些技術,您可以建立一個能夠準確匹配平衡括號並傳回所需匹配結果的正規表示式:

<code>"funcPow((3),2)"</code>
登入後複製

掌握正規表示式的這些高級功能,您可以優雅且有效率地解決諸如平衡括號之類的複雜字串處理難題。

以上是如何使用正規表示式僅匹配字串中平衡的括號?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板