我想测试一个不以 .html结尾的网址
这是我提出的模式:
[/\w\.-]+[^\.html$]
以下匹配,因为它不会以 .html
结尾/blog/category/subcategory/
这不匹配,因为它以 .html :
结尾/blog/category/subcategory/index.html
但是,以下内容不匹配,但我希望它匹配,因为它以 .ht 结尾,而不是 .html
/blog/category/subcategory/index.ht
我应该如何改变模式?
答案 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.-])+$/