【问题标题】:Regex to match comma not between grouping symbols正则表达式匹配逗号不在分组符号之间
【发布时间】:2011-09-02 05:44:14
【问题描述】:

我需要一个正则表达式来匹配不在“[”和“]”或“(”和“)”或“{”和“}”之间的逗号。其他分组符号无关紧要。我试图弄清楚,但我想不出任何可以做到这一点的方法。

正则表达式将与 PHP preg_split 函数一起使用,以在匹配的逗号上拆分字符串。

包含逗号和分组符号的示例字符串:

<div>Hello<div>,@func[opt1,opt2],{,test},blahblah

字符串应按如下方式拆分:

1: '<div>Hello<div>'
2: '@func[opt1,opt2]'
3: '{,test}'
4: 'blahblah'

我只是想到了这一点,但此时所有分组符号都保证有匹配的符号,以防万一。

任何帮助都会非常感激 =)

【问题讨论】:

    标签: php regex preg-split


    【解决方案1】:

    实际上,完成这种拆分并非不可能。考虑这段代码:

    $str = '<div>Hello<div>,(foo,bar),@func[opt1,opt2],{,test},blahblah';
    $arr = preg_split('~([^,]*(?:{[^}]*}|\([^)]*\)|\[[^]]*])[^,]*)+|,~', $str, -1 , PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
    var_dump($arr);
    

    输出:

    array(5) {
      [0]=>
      string(15) "<div>Hello<div>"
      [1]=>
      string(9) "(foo,bar)"
      [2]=>
      string(16) "@func[opt1,opt2]"
      [3]=>
      string(7) "{,test}"
      [4]=>
      string(8) "blahblah"
    }
    

    【讨论】:

    • @alex:谢谢,来自这样一位主题专家,意义重大。
    • 您可能希望重复捕获组,并且可能还允许其他字符 - 考虑 1,[foo]and{bar},3。嗯,其实 OP 同意我的观点,预期的输出是@func[opt1,opt2]。我永远无法解决的另一个问题是空令牌。如果您解析列,您希望保留它们:1,,,4。只是想法。
    • @Kobi:感谢您的 cmets。我更正了我的答案以使其重复。请检查,不是它捕获@func[opt1,opt2]。此外,由于我使用PREG_SPLIT_NO_EMPTY 标志,因此对于字符串1,,4,它将输出14。但是,如果您删除此标志,它会正确打印 1""""4
    • 哇。你在这里有非常有趣的解决方案。 +1
    • 哇,这太棒了,总是被您的高质量答案所吸引。赞成。 :)
    【解决方案2】:

    我认为它不能在正则表达式中完成。基本问题是,这需要可变长度的负向回溯(不允许任何 [({ 后面没有 ])}),这不是 RE 当前具有的功能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-31
      • 1970-01-01
      • 2011-07-16
      • 2021-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多