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

时间:2014-08-20 21:29:12

标签: php regex string

我以前从未使用过前瞻,在正则表达式中看后面,所以我正在努力解决这个问题。

给出这样的字符串:

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

我想要做的是被角色爆炸并获得它们之间的所有内容。

现在,如果字符串是:

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

那没关系,我甚至不需要正则表达式,我只能做explode("|", $str)并获得一系列项目。

但是,如果我将那个管道字符引入该中间字符串,它会抛出整个事物。

所以我到目前为止尝试的是提出一个与管道符号匹配的正则表达式如果它没有左边的引用并且右边没有引号,但是它不是很好。

到目前为止,我所管理的只是匹配|当任何一方没有直接引用时,例如左:

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

当我尝试将(.*?)之类的内容引入其中以检查引号和|之间是否有任何内容时,它会给出一个关于“lookbehinds需要为零宽度”的错误(这是在{ {3}})

有人能指出我正确的方向吗?我可以预见我会坐在这里几个小时搞乱这个。

干杯。

1 个答案:

答案 0 :(得分:0)

你可以在没有后视的情况下做到这一点,而只是使用前瞻。我们可以提前查看管道中的偶数引号:

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

这不会捕获组的尾随管道,因为至少在我的正则表达式工具返回所有匹配项时,它不会将管道重复计算为结束分隔符并启动分隔符。
运行上述内容后,我发现:|'a' |$b |'...|...' |'c' |$d