Вместо того, чтобы использовать негативную перспективу, иногда проще использовать отрицание вне регулярного выражения на уровне языка хостинга. Во многих языках оператором дополнения boolean
является унарный !
.
Так что вы можете написать что-то вроде этого:
! str.hasMatch(/\.php$/)
В зависимости от языка, вы также можете вообще пропустить регулярное выражение и использовать что-то вроде (например, Java):
! str.endsWith(".php")
Что касается проблемы с самим исходным шаблоном:
(.*?)(?!\.php)$ // original pattern, doesn't work!
Это соответствует, скажем, file.php
, потому что (.*?)
может захватить file.php
, и если смотреть впереди , вы не можете сопоставить \.php
, но вы можете сопоставить $
так что в целом это совпадение! Возможно, вы захотите использовать внешний вид за , или, если он не поддерживается, вы можете посмотреть начало строки.
^(?!.*\.php$).*$ // negative lookahead, works
Это будет соответствовать всем строкам, которые не заканчиваются на ".php"
, используя отрицательный прогноз.
Ссылки
Смежные вопросы