Regex 当逗号不在任何括号内时,用逗号分解字符串

Regex 当逗号不在任何括号内时,用逗号分解字符串,regex,preg-replace,Regex,Preg Replace,我有字符串“xyz(text1,(text2,text3)),asd“我想用它来分解,但唯一的条件是分解只能发生在,上,它们不在任何括号内(这里是()) 我在stackoverflow上看到了许多这样的解决方案,但它不符合我的模式。()() 对于我的模式,什么是正确的正则表达式 在我的例子中,xyz(text1,(text2,text3)),asd 结果应该是 xyz(text1,(text2,text3))和asd您可以使用带有以下内容的正则表达式的匹配方法: 见 详细信息 \w+-1+字字

我有字符串“xyz(text1,(text2,text3)),asd“我想用它来分解,但唯一的条件是分解只能发生在
上,它们不在任何括号内(这里是
()

我在stackoverflow上看到了许多这样的解决方案,但它不符合我的模式。()()

对于我的模式,什么是正确的正则表达式

在我的例子中,
xyz(text1,(text2,text3)),asd

结果应该是


xyz(text1,(text2,text3))
asd

您可以使用带有以下内容的正则表达式的匹配方法:

详细信息

  • \w+
    -1+字字符
  • (\(((?:[^()]+++(?1))*\)?
    -可选的捕获组匹配
    • \(
      -a
    • (?:[^()]++|(?1))*
      -零次或多次出现
      • [^()]++
        -1+字符,而不是
      • |
        -或
      • (?1)
        -整个第1组模式
    • \)
      -a
:

输出:

Array
(
    [0] => xyz(text1,(text2,text3))
    [1] => asd
)

如果要求在
处拆分,但只在嵌套的括号外拆分,另一个想法是使用,括号内的内容也可以使用

或者

管道字符的左侧用于匹配和跳过括号内的内容。
在右侧,它将匹配括号外的其余逗号


使用的模式是不同常见模式的变体,以匹配嵌套的父项。

经常使用@WiktorStribiżew thx。成功了。正则表达式很神奇。我想更多地了解它:D
$rx = '/\w+(\((?:[^()]++|(?1))*\))?/';
$s = 'xyz(text1,(text2,text3)),asd';
if (preg_match_all($rx, $s, $m)) {
    print_r($m[0]);
}
Array
(
    [0] => xyz(text1,(text2,text3))
    [1] => asd
)
$res = preg_split('/(\((?>[^)(]*(?1)?)*\))(*SKIP)(*F)|,/', $str);