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

如何编写正则表达式仅匹配嵌套括号中的中间括号内容?

解决方案:匹配嵌套括号中的中间层级内容

嘿,这个问题我太懂了!之前处理数学表达式解析的时候也踩过同样的坑——普通正则要么贪婪吞掉整个外层括号,要么非贪婪匹配最浅的内层,根本没法精准定位嵌套结构里的中间括号。下面给你两种可行的方案,根据你的正则引擎环境选就行:

方案一:使用递归正则(支持递归的引擎,如Python 3.10+/PCRE)

如果你的正则引擎支持递归(比如Python 3.10及以上的re模块、PHP的preg系列函数),可以用递归正则精准匹配被外层括号包裹、自身无嵌套的中间括号对:

正则表达式(匹配整个中间括号对)

(?<=(\((?:[^()]+|(?1))*))(\([^()]+\))(?=(?:[^()]+|(?1))*\))

正则解释

  • (?<=(\((?:[^()]+|(?1))*)):正向预查,确保当前括号对的前面是一个完整的嵌套括号结构(通过子组1递归匹配任意深度的括号)
  • (\([^()]+\)):匹配自身无嵌套的括号对(也就是你要的中间内容),并捕获为分组
  • (?=(?:[^()]+|(?1))*\)):正向预查,确保当前括号对的后面是对应的闭合嵌套结构

Python示例代码

import re

# 匹配整个中间括号对的正则
pattern = r'(?<=(\((?:[^()]+|(?1))*))(\([^()]+\))(?=(?:[^()]+|(?1))*\))'
text = 'x(x+3(x+3))'
matches = re.findall(pattern, text)

# 提取匹配到的中间括号对
result = [match[1] for match in matches]
print(result)  # 输出: ['(x+3)']

# 如果只需要括号内的内容,把正则改成:
# pattern = r'(?<=(\((?:[^()]+|(?1))*))\(([^()]+)\)(?=(?:[^()]+|(?1))*\))'
# result = [match[1] for match in matches]
# 输出: ['x+3']

方案二:手动计数括号深度(兼容所有环境)

如果你的正则引擎不支持递归(比如旧版本Python),手动遍历字符串计数括号深度的方法更可靠,也更容易调试:

Python示例代码

text = 'x(x+3(x+3))'
depth = 0
start_idx = None
matches = []

for idx, char in enumerate(text):
    if char == '(':
        depth += 1
        # 深度为2时,说明进入了中间层级的括号
        if depth == 2:
            start_idx = idx
    elif char == ')':
        # 深度为2时,说明到达中间层级括号的结尾
        if depth == 2:
            matches.append(text[start_idx:idx+1])
        depth -= 1

print(matches)  # 输出: ['(x+3)']

原理说明

通过遍历字符串,用depth变量记录当前括号的嵌套层级:

  • 遇到(时深度+1,深度为2时标记中间括号的起始位置
  • 遇到)时深度-1,深度为2时截取从起始位置到当前位置的内容,就是你要的中间括号内容

为什么之前的正则不行?

普通正则无法处理动态嵌套的括号结构:

  • 贪婪模式\(.*\)会从第一个(匹配到最后一个),直接吞掉整个外层括号内容
  • 非贪婪模式\(.*?\)会从第一个(匹配到最近的),只能拿到最浅的内层括号(但如果有多层嵌套,可能会匹配到多个浅层级,不符合你的需求)
    只有递归正则或手动深度计数,才能精准识别嵌套层级,定位到中间的括号内容。

内容的提问来源于stack exchange,提问作者Purple dragon unicorn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:39:04