我知道可以匹配一个单词,然后用其他工具逆转比赛(例如 grep -v)。但是,可以匹配不包含一个特定的单词,例如 hede,使用常规表达式的线条吗?

入口:

hoho
hihi
haha
hede

代码:

grep "<Regex for 'doesn't contain hede'>" input

所需的产量:

hoho
hihi
haha

当前回答

只要你正在处理线路,只需标记负面比赛,并瞄准其余。

事实上,我用这个技巧与 sed 因为 ^(?!hede)*$ 看起来不受它支持。

对于所需的产量

标记负面相匹配:(例如,线与目标),使用一个字符不包含在整个文本,一个 emoji 可能是一个很好的选择为此目的。 s/(*hede)/\1/g 目标其余(未标记的线:例如,线与目标无目标)。 假设你只想保持目标并删除其余(如你想要): s/^。

为了更好的理解

假设你想删除目标:

其他回答

答案:

^((?!hede).)*$

解释:

^ 序列的开始,(组和捕获到 \1 (0 或更多次(匹配尽可能多的数量)),(?! 向前看,看看是否存在,

把你的绳子,

(注:因为你在捕获中使用量子,只有捕获模式的最后重复将存储在1美元之前的选项,而字符的结尾。

^hede$(*SKIP)(*F)|^.*$

这将完全滑动包含准确的线条的线条,并匹配所有剩下的线条。

演示

符号前的部分. 符号不应匹配. ^hede$(*SKIP)(*F) 符号后的部分. 符号应匹配。

第一部分

^hede$(*SKIP)(*F)

解释:

因此,包含字符串的线条将被匹配. 一旦雷格斯发动机看到以下 (*SKIP)(*F)(注:你可以写 (*F)作为 (*FAIL))字符,它滑动并使匹配失败。

第2部分

^.*$

解释:

请注意,解决方案不会从“现在”开始:

^(?!hede).*$

一般来说,它比解决方案不包含“这些”的更有效:

^((?!hede).)*$

前者只在输入行的第一个位置检查“点”而不是每个位置。

如果您希望 regex 测试只会失败,如果整个序列相匹配,则下列内容将工作:

^(?!hede$).*

例如 - 如果你想允许除了“foo”以外的所有值(即“foofoo”,“barfoo”和“foobar”将通过,但“foo”将失败),请使用: ^(?!foo$)。

当然,如果你正在检查准确的平等,在这种情况下,一个更好的总体解决方案是检查序列平等,也就是说。

myStr !== 'foo'

您甚至可以将拒绝置于测试之外,如果您需要任何 regex 功能(这里,案例不敏感性和范围匹配):

!/^[a-f]oo$/i.test(myStr)

但是,这个答案的顶部的 regex 解决方案在需要积极的 regex 测试的情况下可能有用(可能是通过 API)。

在我看来,一个更可读的答案:

^(?!.*hede)

基本上,“在线的开始,如果和只有如果它没有“<unk>”在它” - 所以要求几乎直接翻译成 reggex。

当然,有可能有多个失败要求:

^(?!.*(hede|hodo|hada))

详细信息: ^ anchor 确保 regex 引擎不会在行中的每个位置撤回比赛,这将匹配每个行。

接口工具匹配每行一次,在与多线条合作的背景下,您可以使用“m”旗帜:

/^(?!.*hede)/m # JavaScript syntax

(?m)^(?!.*hede) # Inline flag