我知道可以匹配一个单词,然后使用其他工具(例如grep -v)反向匹配。但是,是否可以使用正则表达式匹配不包含特定单词的行,例如hede?
输入:
hoho
hihi
haha
hede代码:
grep "<Regex for 'doesn't contain hede'>" input所需输出:
hoho
hihi
haha发布于 2014-07-15 02:21:55
通过负向先行,正则表达式可以匹配不包含特定模式的内容。巴特·基尔斯回答并解释了这一点。很好的解释!
然而,使用Bart Kier的答案,先行部分将在匹配任何单个字符的同时提前测试1到4个字符。我们可以避免这种情况,让先行部分检查整个文本,确保没有'hede',然后正常部分(.*)可以一次吃掉整个文本。
下面是改进后的正则表达式:
/^(?!.*?hede).*$/注意(*?)在负向前视部分中的惰性量词是可选的,您可以使用(*)贪婪量词,这取决于您的数据:如果'hede‘确实存在,并且在文本的前半部分,则惰性量词可以更快;否则,贪婪量词更快。然而,如果'hede‘不存在,两者都将同样缓慢。
这是demo code。
有关lookahead的更多信息,请查看优秀的文章:Mastering Lookahead and Lookbehind。
另外,请查看RegexGen.js,这是一个帮助构造复杂正则表达式的JavaScript正则表达式生成器。使用RegexGen.js,您可以以更具可读性的方式构造正则表达式:
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()
);https://stackoverflow.com/questions/406230
复制相似问题