Регулярное выражение: совпадение, если оно не заканчивается в определенной последовательности
Я бы хотел проверить URL-адрес, который НЕ заканчивается на .html
Это шаблон, который я придумал:
[/\w\.-]+[^\.html$]
Следующие совпадения, потому что они не заканчиваются на .html
/blog/category/subcategory/
Это не соответствует, потому что заканчивается на .html:
/blog/category/subcategory/index.html
Однако следующее не совпадает, хотя я хочу, чтобы оно соответствовало, потому что оно заканчивается на .ht, а не .html
/blog/category/subcategory/index.ht
Как мне изменить шаблон?
Ответы
Ответ 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.-])+$/