如何编写支持嵌套括号匹配的正则表达式并实现指定分组捕获?
实现嵌套括号结构的正则匹配与捕获
当然可以实现你的需求,但核心前提是你使用的正则引擎支持递归匹配——这是处理嵌套括号这类层级结构的关键。你之前尝试的\w+\(.*?\)之所以达不到预期,是因为非贪婪匹配.*?会在遇到第一个右括号)就停止,完全无法识别内部嵌套的括号结构。
核心思路
我们需要构建一个能递归识别括号嵌套的正则,目标是匹配标识符(括号内内容)的结构,同时捕获:
- $0:整个匹配的完整字符串
- $1:标识符部分(
\w+匹配的内容) - $2:括号内的所有内容(包括嵌套的括号,空内容则捕获空字符串)
支持递归的正则示例
下面针对主流支持递归的正则引擎给出实现:
JavaScript 版本
const regex = /(\w+)\((((?R)|[^()])*)\)/g; const text = 'Match1(Match2())'; let match; while ((match = regex.exec(text)) !== null) { console.log(`$0: '${match[0]}', $1: '${match[1]}', $2: '${match[2]}'`); }
运行后输出:
$0: 'Match1(Match2())', $1: 'Match1', $2: 'Match2()' $0: 'Match2()', $1: 'Match2', $2: ''
这里(?R)是递归引用整个正则表达式的语法,它会匹配和整个正则相同的结构,从而识别嵌套的括号。[^()]则匹配非括号的普通字符,两者结合就能覆盖括号内的所有内容。
Python 3.10+ 版本
Python 3.10开始支持命名组的递归引用:
import re pattern = re.compile(r'(\w+)\((((?P<recurse>(?R))|[^()])*)\)') text = 'Match1(Match2())' for match in pattern.finditer(text): print(f"$0: '{match.group(0)}', $1: '{match.group(1)}', $2: '{match.group(2)}'")
运行结果和JavaScript版本完全一致。
注意事项
如果你的正则引擎不支持递归匹配(比如Python 3.9及更早版本、部分轻量型正则库),纯正则表达式就很难处理嵌套括号了——这类情况下,更推荐结合代码手动计数括号的层级:遍历字符串时记录左括号和右括号的数量,直到括号层级回到0时才完成匹配。
内容的提问来源于stack exchange,提问作者MyD ABD
相关产品推荐
相关产品推荐

