【问题标题】:Regex ignore the delimiter in parentheses正则表达式忽略括号中的分隔符
【发布时间】:2020-02-19 18:27:05
【问题描述】:

早上好, 我需要你的一点帮助。 我需要使用正则表达式拆分文本,但要省略括号中的内容

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);

【问题讨论】:

  • 对于给定的字符串,并且没有任何更具体的要求或限制,我会使用 explode(',', 'Test A, Test B, Test C (data1, data1)', 3) 而不是正则表达式 ...
  • Array ( [0] => Test A [1] => Test B [2] => Test C (data1, data1), Test D (data1, data1), Test E (data1, data1) )
  • 那么您现在想说的是,您需要匹配的内容比您给出的示例实际显示的内容更多吗?那么举一个更好的例子,分别。 正确的解释你需要从什么开始匹配。
  • 我有更多字符串,你需要用分隔符(逗号)将它们分开,以便忽略括号中的(逗号),因为括号是参数的一部分。
  • Teď jsem zkoušel tohle: preg_split('/,(?![^(]*\)) /', $input_line); a to mi zatím funguje dle potřeb,

标签: php regex


【解决方案1】:

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

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

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

Regex demo | Php demo

$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))
)

【讨论】:

    猜你喜欢
    • 2021-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-03
    • 2019-02-08
    • 1970-01-01
    • 2022-12-31
    相关资源
    最近更新 更多