首页 > 解决方案 > 正则表达式忽略括号中的分隔符

问题描述

早上好,我需要你的帮助。我需要使用 REGEX 拆分文本,但要省略括号中的内容

preg_match_all('/\((?:[^()]|(?R))+\)|\'[^\']*\'|[^(),]+/', $input_lines, $output_array);

我有这个字符串: Test A, Test B, Test C (data1, data1)

预赛我们这样做:

0   =>  Test A
1   =>   Test B
2   =>   Test C 
3   =>  (data1, data1)

我怎样才能达到这个结果?

0   =>  Test A
1   =>  Test B
2   =>  Test C (data1, data1)

我需要忽略括号中的内容,只分开其余的内容。

预先感谢您的任何帮助。

编辑

这最终解决了我的情况。我尝试使用 preg split。

preg_split('/,(?![^(]*\)) /', $input_line);

标签: phpregex

解决方案


您可能要做的是使用递归模式来递归第一个子模式,(?1)以匹配所有括号,因此拆分也不会在括号内拆分并使用SKIP FAIL

然后用逗号分割,后跟 0+ 个水平空白字符

(\((?:[^()]++|(?1))*\))(*SKIP)(*F)|,\h*

正则表达式演示| php演示

$re = '/(\((?:[^()]++|(?1))*\))(*SKIP)(*F)|,\h*/';
$strings = [
    "Test A, Test B, Test C (data1, data1)",
    "Test A, Test B, Test C (data1, data1), Test D (data1, data1), Test E (data1, data1(data, data))",
    "Test A, Test B, Test C (data1, data1), Test D (data1, data1), Test E ((data1, data1))"
];

foreach($strings as $s) {
    print_r(preg_split($re, $s));
}

输出

Array
(
    [0] => Test A
    [1] => Test B
    [2] => Test C (data1, data1)
)
Array
(
    [0] => Test A
    [1] => Test B
    [2] => Test C (data1, data1)
    [3] => Test D (data1, data1)
    [4] => Test E (data1, data1(data, data))
)
Array
(
    [0] => Test A
    [1] => Test B
    [2] => Test C (data1, data1)
    [3] => Test D (data1, data1)
    [4] => Test E ((data1, data1))
)

推荐阅读