Я хочу найти случаи, когда захваченная группа не появляется позже в строке:
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 не поддерживает обратные ссылки внутри отрицательного вида, но другие реализации regex могут. Таким образом, что-то вроде этого будет соответствовать недопустимым строкам, которые я хочу сопоставить, но это не работает в php:
/^ +\w+([A-Z][a-z+]) += +\w+(?<!\1)$/mg
Есть ли что-нибудь еще, что могло бы работать, кроме сопоставления всех трех строк и циклического прохождения совпадений в php foreach?
Попробуйте использовать отрицательный взгляд вместо отрицательного взгляда сзади. Он работает одинаково хорошо, плюс работает в PHP.
^ +\w+([A-Z][a-z]+) += +(?!\w+\1).*$
Один вариант будет, перед каждым повторным \w
после =
, используйте отрицательный взгляд на \1$
:
^ +\w+([A-Z][a-z]+) += +(?:(?!\1$)\w)+$
^^^^^^^^^^^^^^
https://regex101.com/r/lon87L/2
Но это исключает совпадение только в случае обратной ссылки прямо в конце строки. Если вы хотите убедиться, что ранее найденная фраза не встречается в любом месте в финале \w
s, просто удалите $
изнутри повторяющаяся группа:
^ +\w+([A-Z][a-z]+) += +(?:(?!\1)\w)+$
^