正则表达式-匹配某些字符之间不匹配的地方


Regular expression - Match where not between certain characters

我以前从来没有在正则表达式中使用过向前看和向后看,所以我在这方面很挣扎。

给定如下字符串:

|'a'|$b|'...|...'|'c'|$d|

我想做的是爆炸的人物|和他们之间的一切。

如果字符串是:

|'a'|$b|'......'|'c'|$d|

这很好,我甚至不需要正则表达式,我可以只做explode("|", $str)并得到一个项目数组。

但是如果我在中间的字符串中引入管道字符它会抛出整个字符串

因此,到目前为止,我所尝试的是提出一个匹配管道字符|的正则表达式,当它的左边没有引号,右边也没有引号时,但是它不是很好。

到目前为止,我所做的就是在两边没有引号的情况下匹配|,例如:left:

/(?<!([']))'|/

当我尝试将(.*?)之类的东西引入其中以检查引号和|之间是否有任何东西时,它会给我一个关于"lookbehind需要为零宽度"的错误(这是在http://regex101.com上)

谁能给我指一下正确的方向?我可以预见我要在这里花几个小时摆弄这个。

欢呼。

你可以不用向后看,而只需使用向前看。我们可以从管道中查找偶数个引号:

'|.*?(?='|)(?=[^']*?(?:[^']*?'[^']*?')*[^']*?$)

这不会捕获组的尾部管道,因为至少在我的regex工具返回所有匹配时,它不会将管道作为结束分隔符和开始分隔符重复计算。
运行上面的程序得到:|'a' |$b |'...|...' |'c' |$d