2013-05-22 2 views
0

Я собираюсь сходить с ума от этого. Я пытаюсь сопоставить все строки, которые заканчиваются .html, но не те, которые заканчиваются на /index.html. Для переписывания, вы будете догадываться. (Я использую Nginx)Отрицательное словосочетание

Я пытался что-то вроде:

^(.*[^(\/index)])\.html$ 

^(.*)(?!index)\.html$ 

Но точка всегда кажется, съедают целиком.

# Should match 
/page.html 
/folder/page.html 

# Should not match 
/page 
/page/index.html 
/index.html 

Почему это не работает?

ответ

2

Вы не заявите о себе, но многие ароматы регулярных выражений поддерживают lookbehinds. Что в вашем случае может быть использован как:

(?<!index)\.html$ 
+0

Я думаю, что смогу. Фу, я думаю, что он работает с добавлением '(. *)' До того, как захватить совпадение. –

-1

Как насчет

^([^(\/index)]*)\.html$ 

На самом деле, я думаю, что не будет соответствовать /index/page.html.

+1

'[^ index]' соответствует одному символу, который не является 'i',' n', 'd' и т. Д. – Qtax

0

Один довольно простой способ, который гарантированно работать:

.*([^i].*|i[^n].*|in[^d].*|ind[^e].*|inde[^x].*|index.+)\.html 

Это будет соответствовать все .*\.html будет соответствовать, если она не заканчивается index.html.