我想查找捕获的组稍后不在字符串中出现的实例:
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中循环匹配之外,还有其他可行的方法吗?
答案 0 :(得分:2)
答案 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)+$
^