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

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

输入:

hoho
嗨
哈哈
赫德

代码:

grep&quot&书信电报;“不包含hede”的正则表达式&gt&引用;输入

所需输出:

hoho
嗨
哈哈

regex不支持反向匹配的概念并不完全正确。您可以通过使用负面环视来模拟此行为:

^((?!hede)。)*$

上面的正则表达式将匹配包含(子)字符串“hede”的任何字符串或不带换行符的行。如前所述,这不是正则表达式“擅长”的(或应该做的),但它仍然是可能的

如果还需要匹配换行符,请使用DOT-ALL修饰符(以下模式中的尾随s):

/^((?!hede)。*$/s

或者内联使用:

/(?)s^((?!hede)。)*$/

(其中,/…/是正则表达式分隔符,即不是模式的一部分)

如果DOT-ALL修饰符不可用,则可以模拟字符类的相同行为[\s\s]

/^((?!hede)[\s\s])*$/

解释

字符串只是n字符的列表。每个字符前后都有一个空字符串。因此n字符列表将具有n+1空字符串。考虑字符串“abHeDeD”:

┌──┬───┬──┬───┬──┬───┬──┬───┬──┬───┬──┬───┬──┬───┬──┬───┬──┐
S=│e1│ A.│e2│ B│e3│ H│e4│ E│e5│ D│e6│ E│e7│ C│e8│ D│e9│
└──┴───┴──┴───┴──┴───┴──┴───┴──┴───┴──┴───┴──┴───┴──┴───┴──┘
索引01 2 3 4 5 6 7

其中,e是空字符串。正则表达式(?!hede)。向前看,看是否没有子字符串“hede”,如果是这种情况(因此看到了其他内容),则(点)将匹配除换行符以外的任何字符。环视也被称为零宽度断言,因为它们不使用任何字符。他们只是断言/验证某些东西

因此,在我的示例中,首先验证每个空字符串,以查看前面是否没有“hede”,然后再由(点)使用字符。regex(?!hede)。将只执行一次,因此它被包装在一个组中,并重复零次或多次:(?!hede)。*。最后,锚定输入的开始和结束,以确保使用整个输入:^((?!hede)。*$

如您所见,输入“ABhedeCD”将失败,因为在e3上,正则表达式(?!hede)失败(前面有就是“hede”

发表评论