【发布时间】:2018-11-15 22:00:52
【问题描述】:
我想查找捕获的组没有出现在字符串后面的实例:
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 中循环匹配之外,还有其他方法可以吗?
【问题讨论】:
-
负面的lookbehinds需要一个固定的编译时间长度。反向引用是具有可变长度的运行时项。一种选择是
(?>\1(*SKIP)(*FAIL)|\w)+并匹配反向引用。这可能也更快。 -
你可以在这里看到它regex101.com/r/6gfSBi/1顺便说一句,只有Dot-Net引擎支持可变宽度的lookbehinds(包括反向引用)。
-
如果必须在 EOS 上,只需在 backref regex101.com/r/QuXJLY/1 后添加
$
标签: php regex negative-lookbehind