正则表达式匹配逗号不在分组符号之间

Posted

技术标签:

【中文标题】正则表达式匹配逗号不在分组符号之间【英文标题】: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'

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

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

【问题讨论】:

【参考方案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]andbar,3。嗯,其实 OP 同意我的观点,预期的输出是@func[opt1,opt2]。我永远无法解决的另一个问题是空令牌。如果您解析列,您希望保留它们:1,,,4。只是想法。 @Kobi:感谢您的 cmets。我更正了我的答案以使其重复。请检查,不是它捕获@func[opt1,opt2]。此外,由于我使用PREG_SPLIT_NO_EMPTY 标志,因此对于字符串1,,4,它将输出14。但是,如果您删除此标志,它会正确打印 1""""4 哇。你在这里有非常有趣的解决方案。 +1 哇,这太棒了,总是被您的高质量答案所吸引。赞成。 :)【参考方案2】:

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

【讨论】:

以上是关于正则表达式匹配逗号不在分组符号之间的主要内容,如果未能解决你的问题,请参考以下文章

如何在.net正则表达式中找到不在括号内的逗号?

正则表达式 - 如果模式匹配,则替换双引号之间的字符(逗号)

正则表达式逗号不表达

hive 正则匹配符号都要转义吗

正则表达式 RegExp 对象

正则表达式匹配引号外的逗号 - XML 模式变体