首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >正则表达式:仅当不以特定序列结束时才匹配

正则表达式:仅当不以特定序列结束时才匹配
EN

Stack Overflow用户
提问于 2011-02-12 04:58:11
回答 2查看 29.7K关注 0票数 16

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

这是我想出的模式:

代码语言:javascript
复制
[/\w\.-]+[^\.html$]

以下匹配项,因为它不是以.html结尾

代码语言:javascript
复制
/blog/category/subcategory/

这不匹配,因为它以.html结尾

代码语言:javascript
复制
/blog/category/subcategory/index.html

但是,以下代码不匹配,尽管我希望它匹配,因为它以.ht而不是.html结尾

代码语言:javascript
复制
/blog/category/subcategory/index.ht

我应该如何改变我的模式?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-02-12 05:01:54

如果您的正则表达式引擎支持负向回看断言,则可以使用该断言:

代码语言:javascript
复制
^[/\w\.-]+(?<!\.html)$

如果你没有lookahead断言,但是你有lookahead,那么你可以用它来代替:

代码语言:javascript
复制
^(?!.*\.html$)[/\w\.-]+$

在线查看它的工作方式:rubular

票数 34
EN

Stack Overflow用户

发布于 2011-02-12 05:01:18

你用的是什么引擎?如果它支持先行断言,您可以执行以下操作:

代码语言:javascript
复制
/((?!\.html$)[/\w.-])+/

如果我们把它分解成组件,它看起来像这样:

代码语言:javascript
复制
(            # 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的一部分。随着这一变化,它变成了

代码语言:javascript
复制
/^((?!\.html$)[/\w.-])+$/
票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4973977

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档