2011-02-11 83 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.-])+$/