正则表达式匹配逗号不在分组符号之间
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
,它将输出1
和4
。但是,如果您删除此标志,它会正确打印 1
、""
、""
、4
。
哇。你在这里有非常有趣的解决方案。 +1
哇,这太棒了,总是被您的高质量答案所吸引。赞成。 :)【参考方案2】:
我认为它不能在正则表达式中完成。基本问题是,这需要可变长度的负向回溯(不允许任何 [( 后面没有 ])),这不是 RE 当前具有的功能。
【讨论】:
以上是关于正则表达式匹配逗号不在分组符号之间的主要内容,如果未能解决你的问题,请参考以下文章