php正则表达式:否定反向查找中的反向引用的替代方法

时间:2018-11-15 22:00:53

标签: php regex negative-lookbehind

我想查找捕获的组稍后不在字符串中出现的实例:

aaaBbb  = CccBbb  <- format is valid, skip
aaaDddd = CccDddd <- format is valid, skip
aaaEeee = CccFfff <- format is not valid, match this one only

因此这与我不想匹配的行(https://regex101.com/r/lon87L/1

相匹配
/^ +\w+([A-Z][a-z+]) += +\w+\1$/mg

我在https://www.regular-expressions.info/refadv.html上读到,php在反向查找后不支持反向引用,但是正则表达式的其他实现可以。所以类似这样的东西会匹配我要匹配的无效行,但是在php中不起作用:

/^ +\w+([A-Z][a-z+]) += +\w+(?<!\1)$/mg

除了匹配所有三行并在php foreach中循环匹配之外,还有其他可行的方法吗?

2 个答案:

答案 0 :(得分:2)

尝试使用负向前瞻而不是负向后视。它同样可以很好地工作,而且可以在PHP中工作。

^ +\w+([A-Z][a-z]+) += +(?!\w+\1).*$

regex101 demo

PHP demo

答案 1 :(得分:1)

一个选择是在\w之后的每个重复=之前,对\1$使用负前瞻:

^ +\w+([A-Z][a-z]+) += +(?:(?!\1$)\w)+$
                        ^^^^^^^^^^^^^^

https://regex101.com/r/lon87L/2

但是,仅当反向引用恰好出现在字符串的结尾时,才排除匹配项。如果要确保在最后\w内在任何地方都不会出现以前匹配的短语,只需从重复组中删除$

^ +\w+([A-Z][a-z]+) += +(?:(?!\1)\w)+$
                                ^

https://regex101.com/r/lon87L/3