如何使用分组递归正则匹配含嵌套括号的赋值语句行?
嵌套结构整行匹配正则实现方案
匹配规则说明
- 命中规则:行内同时存在「带任意嵌套圆括号的标识符 + 等号 + 带任意嵌套花括号的标识符」结构时,捕获整行
- 排除规则:缺少等号、仅带圆括号无后续花括号赋值、仅带花括号无前置括号赋值的行全部不匹配
测试用例
- 命中:
foo(f1, f2()) = bar { b1, b2 {}} //match all of this - 排除:
foo(f3) // dont match this - 排除:
bar{b3} // dont match this
可用正则(支持递归语法的正则引擎可用)
^.*?\w+(?<parens>\((?:[^()]|(?&parens))*\))\s*=\s*\w+\s*(?<braces>\{(?:[^{}]|(?&braces))*\}).*$
核心递归逻辑说明
- 圆括号嵌套匹配:
(?<parens>\((?:[^()]|(?&parens))*\))
定义命名捕获组parens匹配平衡圆括号对,组内要么匹配非括号普通字符,要么递归调用parens组本身匹配嵌套的括号结构,支持任意层级的圆括号嵌套。 - 花括号嵌套匹配:
(?<braces>\{(?:[^{}]|(?&braces))*\})
定义命名捕获组braces匹配平衡花括号对,组内要么匹配非花括号普通字符,要么递归调用braces组本身匹配嵌套的花括号结构,支持任意层级的花括号嵌套。
注意事项
- 该正则依赖正则引擎的递归子组语法,仅在PCRE(PHP、Nginx默认正则引擎)、Python第三方
regex库、Java 9+内置正则、.NET正则环境下可正常运行。 - 原生JavaScript、Go标准库正则、Rust默认regex库不支持递归语法,无法通过单个正则实现该需求,需要手写栈结构做括号平衡校验。
内容的提问来源于stack exchange,提问作者Chebz
相关产品推荐
相关产品推荐

