php regex: альтернатива обратным ссылкам в негативном виде - PullRequest
0 голосов
/ 16 ноября 2018

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

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?

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

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

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

regex101 demo

PHP демо

0 голосов
/ 16 ноября 2018

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

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

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

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

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

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

...