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

入口:

hoho
hihi
haha
hede

代码:

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

所需的产量:

hoho
hihi
haha

当前回答

我必须同意其他答案,但是:如果这只是假设问题,那么一个假设不是正确的选择。

其他回答

答案非常好,只是一个学术点:

计算机科学的理论意义上的常规表达是不可能这样做的,对他们来说,它应该看起来像这样:

^([^h].*$)|(h([^e].*$|$))|(he([^h].*$|$))|(heh([^e].*$|$))|(hehe.+$) 

这只是一场完整的比赛,做下一场比赛会更可怕。

^((?!hede).)*$

而且,如果你需要匹配线打破车也,使用DOT-ALL修改器(在下面的模式中的跟踪器):

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

或使用 inline:

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

如果 DOT-ALL 修改器不适用,您可以模拟相同的行为与字符类 [\s\S]:

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

解释

    ┌──┬───┬──┬───┬──┬───┬──┬───┬──┬───┬──┬───┬──┬───┬──┬───┬──┐
S = │e1│ A │e2│ B │e3│ h │e4│ e │e5│ d │e6│ e │e7│ C │e8│ D │e9│
    └──┴───┴──┴───┴──┴───┴──┴───┴──┴───┴──┴───┴──┴───┴──┴───┴──┘
    
index    0      1      2      3      4      5      6      7

在哪里是e的是空的线条. 雷格斯(?!hede)看向前看,看看是否没有任何字符的“hede”可以看到,如果是这样的情况(所以另一个东西可以看到),那么.(dot)将匹配任何字符,除了线条中断。

正如你可以看到的,输入“ABhedeCD”将失败,因为在e3上, regex(?!hede)失败(有“hede”在前面!)。

OP 没有指定或标记帖子,以显示背景(编程语言、编辑器、工具)中将使用 Regex。

对于我来说,有时我需要在使用 Textpad 编辑文件时做到这一点。

Textpad 支持一些 Regex,但不支持 lookahead 或 lookbehind,所以需要几步。

    Search string:^(.)  
    Replace string:<@#-unique-#@>\1  
    Replace-all  

    Search string:<@#-unique-#@>.*hede.*\n  
    Replace string:<nothing>  
    Replace-all  

此分類上一篇

此分類上一篇

    Search string:<@#-unique-#@>
    Replace string:<nothing>  
    Replace-all  

现在你有原始文本,所有包含字符串的线条已被删除。


此分類上一篇

    Search string:^(.)  
    Replace string:<@#-unique-#@>\1  
    Replace-all  

对于包含字符串标签的所有行,请删除独特的“标签”:

    Search string:<@#-unique-#@>(.*hede)
    Replace string:\1  
    Replace-all  

此分類上一篇

此时此刻,所有以独特的“标签”开始的线条,不包含线条标签,我现在只能用这些线条来做我的某事。

当我完成时,我将从所有行中删除独特的“标签”(替换行是空的):

    Search string:<@#-unique-#@>
    Replace string:<nothing>  
    Replace-all  

这就是我这样做的方式:

^[^h]*(h(?!ede)[^h]*)*$

比其他答案更准确、更有效,它实施了弗里德尔的“无滚动”效率技术,需要更少的后续追踪。

答案:

^((?!hede).)*$

解释:

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

把你的绳子,

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