我想测试一个不以.html结尾的网址
这是我提出的模式:
[/\w\.-]+[^\.html$]
Run Code Online (Sandbox Code Playgroud)
以下匹配,因为它不以.html结尾
/blog/category/subcategory/
Run Code Online (Sandbox Code Playgroud)
这不匹配,因为它以.html结尾:
/blog/category/subcategory/index.html
Run Code Online (Sandbox Code Playgroud)
但是,以下内容不匹配,虽然我希望它匹配,因为它以.ht而不是.html结尾
/blog/category/subcategory/index.ht
Run Code Online (Sandbox Code Playgroud)
我应该如何改变我的模式?
Mar*_*ers 34
如果正则表达式引擎支持,则可以使用负向lookbehind断言:
^[/\w\.-]+(?<!\.html)$
Run Code Online (Sandbox Code Playgroud)
如果你没有lookbehind断言,但你确实有前瞻,那么你可以使用它:
^(?!.*\.html$)[/\w\.-]+$
Run Code Online (Sandbox Code Playgroud)
看到它在线工作:rubular
Lil*_*ard 17
你用的是什么引擎?如果它是支持前瞻断言的那个,您可以执行以下操作:
/((?!\.html$)[/\w.-])+/
Run Code Online (Sandbox Code Playgroud)
如果我们将其分解为组件,它看起来像这样:
( # 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
Run Code Online (Sandbox Code Playgroud)
这意味着,对于每个角色,它会在消耗角色之前测试模式/.html /在此处不匹配.
您可能还希望^在开始和$结束时锚定整个模式以强制它匹配整个URL - 否则它只能匹配URL的一部分.随着这种变化,它变成了
/^((?!\.html$)[/\w.-])+$/
Run Code Online (Sandbox Code Playgroud)