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

正则表达式优化需求:仅匹配最后一组括号内的内容

匹配字符串中最后一组括号内的内容(支持嵌套括号)

我完全懂你的需求:你要捕获字符串里最后一对括号内的内容,还得允许这对括号内部嵌套其他括号,同时要排除前面的括号内容。之前用的\((.*?)\)是非贪婪匹配,会抓最开头的括号内容,肯定满足不了;而\(([^()]+)\)又处理不了嵌套括号的情况,所以得用支持平衡括号匹配的正则方案。

解决方案正则表达式

根据你的需求,这里提供适用于支持递归正则的引擎(比如PCRE、Python的regex库、PHP等)的正则:

\((([^()]*(?:\((?R)\)[^()]*)*))\)$

如果是在JavaScript(ES2018及以上)中,可以用命名捕获组的递归写法:

\((?<content>[^()]*(?:\((?&content)\)[^()]*)*)\)$

正则逻辑拆解

核心思路就是精准匹配最后一对闭合括号,同时兼容内部嵌套:

  • \( 和 \):匹配目标括号的左右边界
  • ([^()]*(?:\((?R)\)[^()]*)*):这是捕获内容的核心部分:
    • [^()]*:先匹配任意非括号的普通字符
    • (?:\((?R)\)[^()]*)*:非捕获组,专门处理嵌套括号:\((?R)\)会递归匹配整个正则(也就是完整的一对括号,包括内部嵌套的),之后再匹配后续的非括号字符,整个组可重复多次,确保所有嵌套结构都被包含
  • $:锚定到字符串末尾,保证我们匹配的是最后一对闭合的括号

测试验证

用你给出的示例验证:

  1. 测试字符串:"(no(yes)"
    • 捕获组结果:yes,完全符合你的期望
  2. 测试字符串:"(no(yes + (1 - 3))"
    • 捕获组结果:yes + (1 - 3),完美支持嵌套括号场景

注意事项

  • 如果你的正则引擎不支持递归(比如Python标准库的re模块),可以改用第三方库regex(通过pip install regex安装),它完全支持递归正则语法
  • 如果字符串末尾没有闭合的右括号,这个正则会匹配失败,你可以根据实际输入情况调整(比如去掉$,但可能会匹配到非末尾的括号,建议优先确保输入的最后一组括号是闭合的)

内容的提问来源于stack exchange,提问作者gruvw

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 16:23:13