首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >正则表达式匹配不包含单词的行

正则表达式匹配不包含单词的行
EN

Stack Overflow用户
提问于 2009-01-02 15:30:16
回答 30查看 4.1M关注 0票数 4.8K

我知道可以匹配一个单词,然后使用其他工具(例如grep -v)反向匹配。但是,是否可以使用正则表达式匹配不包含特定单词的行,例如hede

输入:

代码语言:javascript
运行
复制
hoho
hihi
haha
hede

代码:

代码语言:javascript
运行
复制
grep "<Regex for 'doesn't contain hede'>" input

所需输出:

代码语言:javascript
运行
复制
hoho
hihi
haha
EN

Stack Overflow用户

发布于 2014-07-15 02:21:55

通过负向先行,正则表达式可以匹配不包含特定模式的内容。巴特·基尔斯回答并解释了这一点。很好的解释!

然而,使用Bart Kier的答案,先行部分将在匹配任何单个字符的同时提前测试1到4个字符。我们可以避免这种情况,让先行部分检查整个文本,确保没有'hede',然后正常部分(.*)可以一次吃掉整个文本。

下面是改进后的正则表达式:

代码语言:javascript
运行
复制
/^(?!.*?hede).*$/

注意(*?)在负向前视部分中的惰性量词是可选的,您可以使用(*)贪婪量词,这取决于您的数据:如果'hede‘确实存在,并且在文本的前半部分,则惰性量词可以更快;否则,贪婪量词更快。然而,如果'hede‘不存在,两者都将同样缓慢。

这是demo code

有关lookahead的更多信息,请查看优秀的文章:Mastering Lookahead and Lookbehind

另外,请查看RegexGen.js,这是一个帮助构造复杂正则表达式的JavaScript正则表达式生成器。使用RegexGen.js,您可以以更具可读性的方式构造正则表达式:

代码语言:javascript
运行
复制
var _ = regexGen;

var regex = _(
    _.startOfLine(),             
    _.anything().notContains(       // match anything that not contains:
        _.anything().lazy(), 'hede' //   zero or more chars that followed by 'hede',
                                    //   i.e., anything contains 'hede'
    ), 
    _.endOfLine()
);
票数 57
EN
查看全部 30 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/406230

复制
相关文章

相似问题

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