如何使用正则表达式提取带有成对开闭方括号的对应值?
嵌套方括号匹配问题解答
是否可以用正则实现
分两种情况:
- 如果你使用的是仅支持基础POSIX正则规则的引擎,无法实现任意层数嵌套的方括号匹配。基础正则本质是有限状态自动机,没有存储嵌套层数的能力,无法处理层数未知的嵌套结构。
- 如果你使用的是PCRE、.NET、Java、Python
regex库这类支持递归匹配特性的现代正则引擎,完全可以实现需求。
可用正则示例
仅匹配成对嵌套的方括号内容
可正确识别任意层数嵌套,不会在第一个闭括号处截断:
\[((?>[^\[\]]+|(?R))*)\]
逻辑说明:
\[匹配左方括号起始(?>[^\[\]]+|(?R))*原子组内匹配两种内容:非方括号的普通字符、递归调用整个正则匹配内层嵌套的方括号结构\]匹配与最外层左括号对应的右方括号
同时匹配三类目标内容
如果要同时匹配[[String]]、[String]、无括号的String三类内容,可增加分支:
\[((?>[^\[\]]+|(?R))*)\]|[^\[\]]+
(可根据你对String的字符范围要求调整最后一段[^\[\]]+的匹配规则)
不支持递归引擎的替代方案
如果所用环境不支持正则递归,直接写简单的栈逻辑解析即可:遍历字符串,遇到[时嵌套计数加1,遇到]时计数减1,计数归0时就截取对应区间的内容,实现复杂度很低。
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

