2011-02-11 82 views
16

沒有結束,我想測試一個URL,它不的.html正則表達式:匹配只有在特定的順序

爲此也是我拿出模式:

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

因爲它沒有在結束的.html

/blog/category/subcategory/ 

這並不匹配,因爲它連接下面的比賽DS在的.html

/blog/category/subcategory/index.html 

但是,下面的不匹配,但我想它來搭配,因爲它在.HT,而不是的.html

/blog/category/subcategory/index.ht 

結束我應該如何改變我的模式?

+1

你使用什麼編程語言或工具? – 2011-02-11 21:07:19

回答

33

如果你的正則表達式引擎支持,可以使用負向後斷言:

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

如果你沒有向後斷言,但是你必須向前看符號,那麼你可以使用來代替:

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

看到它聯機工作:rubular

+0

@Khnle:我期望它取決於引擎和輸入字符串的分佈。 – 2011-02-11 21:37:23

17

您使用的是什麼引擎?如果它是一個支持向前斷言,你可以做到以下幾點:

/((?!\.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.-])+$/