php 正则表达式:在负回顾中替代反向引用

php regex: Alternative to backreference in 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+$/mg

我在 https://www.regular-expressions.info/refadv.html 上读到 php 不支持负向回顾内的反向引用,但正则表达式的其他实现可以。所以像这样的东西会匹配我想要匹配的无效行,但它在 php:

中不起作用
/^ +\w+([A-Z][a-z+]) += +\w+(?<!)$/mg

除了匹配所有三行并在 php foreach 中循环匹配外,还有什么可以工作的吗?

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

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

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

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

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

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

尝试使用否定前瞻而不是否定回顾。它工作得同样好,而且它在 PHP.

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

regex101 demo

PHP demo