首頁 >Java >java教程 >如何在沒有遞歸或平衡組的情況下匹配嵌套括號?

如何在沒有遞歸或平衡組的情況下匹配嵌套括號?

DDD
DDD原創
2024-10-25 02:35:02467瀏覽

How to Match Nested Brackets Without Recursion or Balancing Groups?

在沒有遞歸或平衡組的情況下匹配嵌套括號

挑戰:

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

挑戰:

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

挑戰:

  • >匹配一組使用缺少遞歸和平衡組支援的正規表示式風格任意嵌套括號,例如Java 的java.util.regex,捕獲給定字串內的三個外部組:
  • 解決方案:將引用轉發到救援
  • 與普遍看法相反,使用前向引用可以匹配沒有這些高級功能的嵌套括號:

分解:

  • 這個複雜的正規表示式分兩個階段運行:
  • 第1 階段: 前瞻括平衡序列而不消耗字元。此過程一直持續到找到完整的外部群組。
  • 第 2 階段: 捕獲組提取匹配的外部組的內容。
  • 工作原理:

檢查'(': 繼續遍歷字串,直到遇到'('。

匹配平衡括號:
(?=\()(?=((?:(?=.*?\((?!.*?)(.*\)(?!.*).*))(?=.*?\)(?!.*?)(.*)).)+?.*?(?=)[^(]*(?=$))) 
使用兩個前瞻來確保下一個'('和')'以平衡的方式匹配,捕獲內部內容。結束括號檢查:

檢查與先前匹配的'(' 匹配的結束')' 並進一步前進。 (' )​​' 的外部群組。匹配的內容保存在一對平衡的括號內:

全面破壞:

表格總結了正規表示式的組件和功能:
Note Component Description
(?=() Look for '('
(?: Start group for iteration
(?=.?((?!.?1)) Look for '(' not followed by 1, which contains the matched inner content
(.)(?!.2).*)) Capture inner content and check for at least one more ')'
(?=.?)(?!.?3)) Look for ')' not followed by 2, which contains the matched outer content
(. ) Capture outer content
. Consume a character
) Close group
? Match as few times as possible
.*?(?=1) Match up to and including the last '('
1*(?=2$) Match up to the last ')' without encountering more '('

  1. (

以上是如何在沒有遞歸或平衡組的情況下匹配嵌套括號?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn