我有一个逗号分隔的字符串,我想匹配每个不在括号中的逗号(保证括号是平衡的)。
a , (b) , (d$_,c) , ((,),d,(,))
a和(b)、(b)和(d$,c)、(d$,c)和((,),d,(,))之间的逗号应该匹配但不在 (d$_,c) 或 ((,),d,(,) 内。
注意:最终我想用这些逗号分割字符串。
它尝试了这个正则表达式:
(?!<(?:\(|\[)[^)\]]+),(?![^(\[]+(?:\)|\]))
来自 here但它仅适用于非嵌套括号。
最佳答案
你可以使用
(\((?:[^()]++|(?1))*\))(*SKIP)(*F)|,
参见 regex demo
详情
(\((?:[^()]++|(?1))*\))
- 捕获组 1:匹配平衡括号之间的子字符串:\(
- 一个(
字符(?:[^()]++|(?1))*
- 除(
和之外的 1+ 个字符出现零次或多次)
或整个第 1 组模式(由于 regex subroutine(?1)
在这里是必需的,因为整个正则表达式模式中只有一部分被递归)\)
-)
字符。
(*SKIP)(*F)
- 省略找到的匹配项并从匹配项末尾开始下一次搜索|
- 或者,
- 匹配嵌套括号外的逗号。
关于regex - perl正则表达式获取不在括号或嵌套括号中的逗号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59671144/