正则表达式:仅在不以特定顺序结束时匹配

时间:2011-02-11 20:58:11

标签: regex

我想测试一个不以 .html结尾的网址

这是我提出的模式:

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

以下匹配,因为它不会以 .html

结尾
/blog/category/subcategory/

这不匹配,因为它以 .html

结尾
/blog/category/subcategory/index.html

但是,以下内容不匹配,但我希望它匹配,因为它以 .ht 结尾,而不是 .html

/blog/category/subcategory/index.ht

我应该如何改变模式?

2 个答案:

答案 0 :(得分:34)

如果正则表达式引擎支持,则可以使用负向lookbehind断言:

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

如果你没有lookbehind断言,但你确实有先行,那么你可以使用它:

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

查看在线工作:rubular

答案 1 :(得分: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 /在此处不匹配。

您可能还希望在开始时使用^锚定整个模式,并在结尾使用$以强制它匹配整个网址 - 否则它只能匹配一个网址的一部分。通过此更改,它变为

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