如何用单个正则表达式匹配方程中任意嵌套层数的外层括号内容?
匹配外层括号内容的通用正则表达式(支持嵌套括号)
你需要的是一个能处理嵌套括号的正则表达式,把之前分散的三个规则合并成一个就搞定了!直接上可以覆盖所有你提到的场景的正则:
\(([^()]*(?:\((?R)\)[^()]*)*)\)
原理拆解
这个正则的核心是通过递归匹配来处理嵌套的括号结构,逐部分解释:
\(:匹配最外层的左括号([^()]*(?:\((?R)\)[^()]*)*):这是我们要捕获的核心内容,里面的逻辑是:[^()]*:先匹配任意非括号的字符(?:\((?R)\)[^()]*)*:非捕获组,用来处理嵌套的括号:\((?R)\)会递归调用整个正则表达式,也就是完整匹配一对括号(包括里面可能的嵌套),之后再跟着任意非括号字符,整个组可以重复0次或多次(对应没有嵌套、一层嵌套、多层嵌套的情况)
\):匹配最外层的右括号
验证你的示例场景
把这个正则用到你给出的所有例子上,都能精准捕获外层括号内的内容:
- 对于
a = 2 / (1 + exp(-2*n)) - 1,捕获结果:1 + exp(-2*n) - 对于
a = 2 / (1 + e) - 1,捕获结果:1+e - 对于
a = 2 / (3*(1 + exp(-2*n))) - 1,捕获结果:3*(1 + exp(-2*n)) - 对于补充的
a = 2 / (1 + exp(-2*n)) - (2-5),会分别捕获到1 + exp(-2*n)和2-5,完美处理多个外层括号的情况
注意事项
如果你的正则引擎不支持递归(比如Python标准库的re模块),可以使用第三方库regex(它支持递归语法),或者针对有限层级的嵌套写一个非递归版本(比如最多两层嵌套的话可以写成 \(([^()]*(?:\([^()]*(?:\([^()]*\)[^()]*)*\)[^()]*)*)\)),但递归版本是最通用的方案。
内容的提问来源于stack exchange,提问作者Karls
相关产品推荐
相关产品推荐

