You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写支持嵌套括号匹配的正则表达式并实现指定分组捕获?

实现嵌套括号结构的正则匹配与捕获

当然可以实现你的需求,但核心前提是你使用的正则引擎支持递归匹配——这是处理嵌套括号这类层级结构的关键。你之前尝试的\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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:08:27