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

入口:

hoho
hihi
haha
hede

代码:

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

所需的产量:

hoho
hihi
haha

当前回答

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  

其他回答

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

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

演示

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

第一部分

^hede$(*SKIP)(*F)

解释:

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

第2部分

^.*$

解释:

如果你只是用它来捕捉,你可以使用捕捉 -v 以获得所有不包含捕捉的线条。

ETA Oh,重新阅读这个问题,抓 -v 可能是你指的是“工具选项”。

不是雷格斯,但我发现使用带管的序列粘贴是合乎逻辑和有用的,以消除噪音。

例如,搜索一个 Apache 配置文件,没有所有评论 -

grep -v '\#' /opt/lampp/etc/httpd.conf      # this gives all the non-comment lines

grep -v '\#' /opt/lampp/etc/httpd.conf |  grep -i dir

序列格雷普的逻辑是(不是一个评论)和(比赛是)

另一个选项是要添加一个积极的视图,并检查视图是否在输入线的任何地方,然后我们会否认,与类似的表达:

^(?!(?=.*\bhede\b)).*$

用词界限。


这个表达式在 regex101.com 的右上方面板上解释,如果你想探索/简化/修改它,在此链接中,你可以看到它会如何与某些样品输入相匹配,如果你愿意。


雷格斯循环

jx.im 可视为常见的表达式:

此分類上一篇

这就是我这样做的方式:

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

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