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

入口:

hoho
hihi
haha
hede

代码:

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

所需的产量:

hoho
hihi
haha

当前回答

使用(?<!hede)是更好的答案(?<!whateverYouDontWantToMatch)是一个负面看向后,而不是(?!whateverYouDontWantToMatch)这是一个负面看向前。这意味着(?<!)它会检查正确的当前位置的线条而不是只是观看比赛。

其他回答

# 一个简单的方式
import re
skip_word = 'hede'
stranger_char = '虩'
content = '''hoho
hihi
haha
hede'''
print(
    '\n'.join(re.findall(
        '([^{}]*?)\n'.format(stranger_char), 
        content.replace(skip_word, stranger_char)
    )).replace(stranger_char, skip_word) 
)

# hoho
# hihi
# haha

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

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

演示

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

第一部分

^hede$(*SKIP)(*F)

解释:

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

第2部分

^.*$

解释:

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

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

用词界限。


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


雷格斯循环

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

此分類上一篇

TXR 语言支持 regex 拒绝。

$ txr -c '@(repeat)
@{nothede /~hede/}
@(do (put-line nothede))
@(end)'  Input

一个更复杂的例子:匹配所有从 a 开始和 z 结束的线条,但不包含底层的线条:

$ txr -c '@(repeat)
@{nothede /a.*z&~.*hede.*/}
@(do (put-line nothede))
@(end)' -
az         <- echoed
az
abcz       <- echoed
abcz
abhederz   <- not echoed; contains hede
ahedez     <- not echoed; contains hede
ace        <- not echoed; does not end in z
ahedz      <- echoed
ahedz

雷格克斯的拒绝本身并不特别有用,但当你也有交叉时,事情变得有趣,因为你有一个完整的布莱恩组操作:你可以表达“与此相匹配的组,除了与此相匹配的东西”。

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

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

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

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