我知道可以匹配一个单词,然后使用其他工具(例如grep-v
)反向匹配。但是,是否可以使用正则表达式匹配不包含特定单词的行,例如hede
输入:
hoho
嗨
哈哈
赫德
代码:
grep"&书信电报;“不包含hede”的正则表达式>&引用;输入
所需输出:
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”
)