php regex: альтернатива обратным ссылкам в негативном виде

Я хочу найти случаи, когда захваченная группа не появляется позже в строке:

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?

5

Решение

Попробуйте использовать отрицательный взгляд вместо отрицательного взгляда сзади. Он работает одинаково хорошо, плюс работает в PHP.

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

regex101 demo

PHP демо

2

Другие решения

Один вариант будет, перед каждым повторным \w после =, используйте отрицательный взгляд на \1$:

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

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

Но это исключает совпадение только в случае обратной ссылки прямо в конце строки. Если вы хотите убедиться, что ранее найденная фраза не встречается в любом месте в финале \ws, просто удалите $ изнутри повторяющаяся группа:

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

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

1

По вопросам рекламы [email protected]