Подтвердить что ты не робот

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

Я бы хотел проверить URL-адрес, который НЕ заканчивается на .html

Это шаблон, который я придумал:

[/\w\.-]+[^\.html$]

Следующие совпадения, потому что они не заканчиваются на .html

/blog/category/subcategory/

Это не соответствует, потому что заканчивается на .html:

/blog/category/subcategory/index.html

Однако следующее не совпадает, хотя я хочу, чтобы оно соответствовало, потому что оно заканчивается на .ht, а не .html

/blog/category/subcategory/index.ht

Как мне изменить шаблон?

4b9b3361

Ответ 1

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

^[/\w\.-]+(?<!\.html)$

Если у вас нет утверждений lookbehind, но у вас есть lookaheads, вы можете использовать это вместо:

^(?!.*\.html$)[/\w\.-]+$

Посмотрите, как он работает в Интернете: rubular

Ответ 2

Какой двигатель вы используете? Если он поддерживает утверждения lookahead, вы можете сделать следующее:

/((?!\.html$)[/\w.-])+/

Если мы разложим его на компоненты, это выглядит так:

(            # start a group for the purposes of repeating
 (?!\.html$) # negative lookahead assertion for the pattern /\.html$/
 [/\w.-]     # your own pattern for matching a URL character
)+           # repeat the group

Это означает, что для каждого символа он проверяет, что шаблон/.html$/не может соответствовать здесь, прежде чем он потребляет символ.

Вы также можете привязать весь шаблон с помощью ^ в начале и $ в конце, чтобы он соответствовал всему URL-адресу - в противном случае он может содержать только часть URL-адреса. С этим изменением он становится

/^((?!\.html$)[/\w.-])+$/