Как сделать регулярное выражение для файлов, заканчивающихся на .php? - PullRequest
2 голосов
/ 04 августа 2010

Я пытаюсь написать очень простое регулярное выражение, которое соответствует любому имени файла, которое не заканчивается на .php.Я придумал следующее ...

(.*?)(?!\.php)$

... однако это соответствует всем именам файлов.Если бы кто-то мог указать мне правильное направление, я был бы очень благодарен.

Ответы [ 3 ]

6 голосов
/ 04 августа 2010

Почти:

.*(?!\.php)....$

Последние четыре точки гарантируют, что есть что-то, на что можно смотреть в , когда проверен прогноз.

внешние скобки не нужны, поскольку вас интересует все совпадение.

Нежелательный .*? не нужен, поскольку возврат на четыре шага более эффективен, чем проверка следующего условия на каждом шаге.

4 голосов
/ 04 августа 2010

Вместо того, чтобы использовать негативную перспективу, иногда проще использовать отрицание вне регулярного выражения на уровне языка хостинга. Во многих языках оператором дополнения boolean является унарный !.

Так что вы можете написать что-то вроде этого:

! str.hasMatch(/\.php$/)

В зависимости от языка, вы также можете вообще пропустить регулярное выражение и использовать что-то вроде (например, Java):

! str.endsWith(".php")

Что касается проблемы с самим исходным шаблоном:

(.*?)(?!\.php)$   // original pattern, doesn't work!

Это соответствует, скажем, file.php, потому что (.*?) может захватить file.php, и если смотреть впереди , вы не можете сопоставить \.php, но вы можете сопоставить $ так что в целом это совпадение! Возможно, вы захотите использовать внешний вид за , или, если он не поддерживается, вы можете посмотреть начало строки.

^(?!.*\.php$).*$  // negative lookahead, works

Это будет соответствовать всем строкам, которые не заканчиваются на ".php", используя отрицательный прогноз.

Ссылки

Смежные вопросы

3 голосов
/ 04 августа 2010

Вы находитесь в конце строки и смотрите впереди .Вместо этого вам нужно взглянуть за :

(.*)$(?<!\.php)

Обратите внимание, что не все движки регулярных выражений поддерживают утверждения за кадром.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...