我以前从来没有在正则表达式中使用过向前看和向后看,所以我在这方面很挣扎。
给定如下字符串:
|'a'|$b|'...|...'|'c'|$d|
我想做的是爆炸的人物|和他们之间的一切。
如果字符串是:
|'a'|$b|'......'|'c'|$d|
这很好,我甚至不需要正则表达式,我可以只做explode("|", $str)
并得到一个项目数组。
但是如果我在中间的字符串中引入管道字符它会抛出整个字符串
因此,到目前为止,我所尝试的是提出一个匹配管道字符|的正则表达式,当它的左边没有引号,右边也没有引号时,但是它不是很好。
到目前为止,我所做的就是在两边没有引号的情况下匹配|,例如:left:
/(?<!([']))'|/
当我尝试将(.*?)
之类的东西引入其中以检查引号和|之间是否有任何东西时,它会给我一个关于"lookbehind需要为零宽度"的错误(这是在http://regex101.com上)
欢呼。
你可以不用向后看,而只需使用向前看。我们可以从管道中查找偶数个引号:
'|.*?(?='|)(?=[^']*?(?:[^']*?'[^']*?')*[^']*?$)
这不会捕获组的尾部管道,因为至少在我的regex工具返回所有匹配时,它不会将管道作为结束分隔符和开始分隔符重复计算。
运行上面的程序得到:|'a'
|$b
|'...|...'
|'c'
|$d