perl正则表达式获取不在括号或嵌套括号中的逗号

Top*_*opa 2 regex perl pcre

我有一个逗号分隔的字符串,我想匹配每个不在括号中的逗号(保证括号是平衡的)。

a   ,   (b)  ,   (d$_,c)    ,     ((,),d,(,))
Run Code Online (Sandbox Code Playgroud)

a 和 (b)、(b) 和 (d$ ,c)、(d$ ,c) 和 ((,),d,(,))之间的逗号应该匹配但不在 (d$_,c) 内或 ((,),d,(,))。

注意:最终我想用这些逗号分割字符串。

它尝试了这个 regex: (?!<(?:\(|\[)[^)\]]+),(?![^(\[]+(?:\)|\]))from here但它只适用于非嵌套括号。

Wik*_*żew 5

您可以使用

(\((?:[^()]++|(?1))*\))(*SKIP)(*F)|,
Run Code Online (Sandbox Code Playgroud)

查看正则表达式演示

细节

  • (\((?:[^()]++|(?1))*\)) - 捕获组 1:匹配平衡括号之间的子字符串:
    • \(- 一个(字符
    • (?:[^()]++|(?1))*- 除()或整个第 1 组模式之外的 1+ 个字符出现零次或多次(由于此处需要正则表达式子例程 (?1),因为仅递归整个正则表达式模式的一部分)
    • \)- 一个)字符。
  • (*SKIP)(*F) - 省略找到的匹配项并从匹配项的末尾开始下一次搜索
  • | - 或者
  • , - 匹配嵌套括号外的逗号。