簡體   English   中英

用於匹配括號中的所有內容的遞歸正則表達式(PCRE)

[英]Recursive regex for matching everything in parenthesis (PCRE)

我很驚訝,不容易找到一個類似的問題與答案的SO。 我想在某些功能中匹配所有內容。 想法是刪除無用的功能。

foo(some (content)) --> some (content)

所以我試圖匹配函數調用中的所有內容,包括括號。 這是我的PCRE正則表達式:

(?<name>\w+)\s*\(\K
(?<e>
     [^()]+
     |
     [^()]*
         \((?&e)\)
     [^()]*
)*
(?=\))

https://regex101.com/r/gfMAIM/1

不幸的是它不起作用,我不明白為什么。

您的組e模式沒有正確的工作,目前,它匹配1個深度級別的括號,因為您只復制了一次e模式。 它需要匹配盡可能多的(...)子串,因此,子程序模式需要在*+量化組內,甚至可以“簡化”為(?<e>[^()]*(?:\\((?&e)\\)[^()]*)*)

請注意,您的組e模式等於(?<e>[^()]+|\\((?&e)\\))* [^()]*圍繞\\((?&e)\\)是多余的,因為[^()]+替代將消耗當前深度級別上的()之外的字符。

此外,您量化了組e模式,使其成為重復捕獲組 ,僅在最后一次迭代期間保持文本匹配。

你可以用

(?<name>\w+)\s*\(\K(?<e>[^()]*(?:\((?&e)\)[^()]*)*)(?=\))

請參閱正則表達式演示

細節

  • (?<name>\\w+)\\s*\\(\\K - 1+個字符,0 +空格和(從匹配中省略)
  • (?<e> - 小組e開始
    • [^()]* - 除了()以外的0+個字符
    • (?: - 非捕獲組的開始:
      • \\( - a ( char
      • (?&e) - 遞歸組e模式
      • \\) - a )
      • [^()]* - 除了()以外的0+個字符
    • )* - 重復0次或更多次
  • ) - e組結束
  • (?=\\)) - a )必須立即在當前位置的右側。

以下正則表達式進行匹配而不采取額外步驟:

(?<name>\w+)\s*(\((?<e>([^()]*+|(?2))+)\))

在這里查看現場演示

但是,這與在帶引號的字符串中包含不平衡括號的后續字符串不匹配:

  • foo(bar = ')')
  • foo(bar(john = "(Doe..."))

所以你應該尋找的是:

(?<name>\w+)\s*(\((?<e>([^()'"]*+|"(?>[^"\\]*+|\\.)*"|'(?>[^'\\]*+|\\.)*'|(?2))+)\))

在這里查看現場演示

正則表達式細分:

  • (?<name>\\w+)\\s*匹配函數名稱和尾隨空格
  • (群集的開始
    • \\(匹配文字(
    • (?<e>命名捕獲組e
      • (開始捕獲組#2
        • [^()'"]*+匹配除()'"之外的任何東西
        • | 要么
        • "(?>[^"\\\\]*+|\\\\.)*"匹配雙引號之間的任何內容
        • | 要么
        • '(?>[^'\\\\]*+|\\\\.)*'匹配單引號之間的任何內容
        • | 要么
        • (?2)遞歸第二個捕獲組
      • )+盡可能重復,至少一次
    • )捕獲組結束
    • \\)匹配)字面意思
  • )捕獲組結束

我有簡單的正則表達式沒有遞歸

(?<=[\w ]{2}\().*(?=\))

到目前為止它處理的是不平衡的perenthesis,但它不處理一行中的多個函數。 如果你知道函數之間的delmiters,它可能會被handeled。 例如; 如果那是Java代碼。

變體2 (針對一行中的多個函數進行了更新):

(?<=[\w ]\()[^;\n]*(?=\))

變體3 (允許;在字符串中):

(?<=[\w ]\()([^;\n]|".*?")*(?=\))    

變體4 (逃避字符串):

(?<=[\w \n]\()(?:[^;\n"]|(?:"(?:[^"]|\\")*?(?<!\\)"))*(?=\))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM