[英]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.