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

Kev*_*nle 16 regex

我想测试一个不以.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)