V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
kyrre
V2EX  ›  程序员

考验一下你的正则功力

  •  
  •   kyrre · 2017 年 3 月 2 日 · 5047 次点击
    这是一个创建于 3244 天前的主题,其中的信息可能已经有所发展或是发生改变。
    需求:
    有如下文本,需要找出不含“ hede “的行, 不要告诉我用 grep -v ,我要纯正则表达式。
    hoho
    hihi
    haha
    hede
    第 1 条附言  ·  2017 年 3 月 3 日
    这个问题的出处是我在用阿里的日志服务时发现它们的正则表达式只能取出要的行,没法剔除指定的行。开了工单,客服也没提出什么实际的解决方案,我以为他们的系统就这样了。
    写复杂的排除正则也是没办法的办法。

    结果戏剧性的结果来了,我开了个脑洞,把他们的过滤配置里的 key 前加了个!,结果就达到我的目的了。
    顺便回了个工单,告诉他们这个功能, 2333333.

    我只能暗暗佩服自己的机智🐶
    29 条回复    2017-03-03 13:58:03 +08:00
    kyrre
        1
    kyrre  
    OP
       2017 年 3 月 2 日
    目前搜到离答案最近的是
    http://stackoverflow.com/questions/406230/regular-expression-to-match-a-line-that-doesnt-contain-a-word
    但悲剧的是我自己用
    grep '^((?!hede).)*$' b.txt
    居然没用。
    des
        2
    des  
       2017 年 3 月 2 日 via Android
    @kyrre egrep ??
    54c3
        3
    54c3  
       2017 年 3 月 2 日   ❤️ 1
    54c3
        4
    54c3  
       2017 年 3 月 2 日
    @54c3 Updated, h([^e])h\1 will do the work.
    https://regex101.com/r/aQUufT/2
    langmoe
        5
    langmoe  
       2017 年 3 月 2 日   ❤️ 5
    http://regex.alf.nu/
    考验功力上这个啊
    hellogbk
        6
    hellogbk  
       2017 年 3 月 2 日
    ^(?!.*hede.*).*$
    ProkillerJ
        7
    ProkillerJ  
       2017 年 3 月 2 日
    5 楼那个网站已经把正则玩出花了,不怕虐的可以去试一下
    DiamondbacK
        8
    DiamondbacK  
       2017 年 3 月 2 日
    Use `grep -P pattern`.
    wojiaodaxiaxia
        9
    wojiaodaxiaxia  
       2017 年 3 月 2 日
    6 楼应该是最准确直观的答案了吧
    loading
        10
    loading  
       2017 年 3 月 2 日
    @hellogbk 的答案是我第一感觉的答案,楼主,下一题吧。
    kinghs
        11
    kinghs  
       2017 年 3 月 2 日 via iPhone
    ^(?!.*hede).*$
    ColinZeb
        12
    ColinZeb  
       2017 年 3 月 2 日
    @langmoe afoot|catfoot|dogfoot|fanfoot|foody|foolery|foolish|fooster|footage|foothot|footle|footpad|footway|hotfoot|jawfoot|mafoo|nonfood|padfoot|prefool|sfoot|unfool
    knightdf
        13
    knightdf  
       2017 年 3 月 2 日
    @langmoe 这个分数是越低越好?
    pysama
        14
    pysama  
       2017 年 3 月 2 日
    /^(?!.*hede).*$/gi
    pysama
        15
    pysama  
       2017 年 3 月 2 日
    @hellogbk 哟,我们的答案好像是一样的
    kyrre
        16
    kyrre  
    OP
       2017 年 3 月 2 日
    且慢点赞。

    @hellogbk 我拿你的正则来跑测试没过。

    grep '^(?!.*hede.*).*$' b.txt

    b.txt 里是我的那几行 string 。
    你是怎么跑过的?
    wjm2038
        17
    wjm2038  
       2017 年 3 月 2 日 via Android
    @ColinZeb foo 不就行了吗。。。
    kyrre
        18
    kyrre  
    OP
       2017 年 3 月 2 日
    @des egrep 貌似没有用,普通的 grep 是支持正则的。
    hellogbk
        19
    hellogbk  
       2017 年 3 月 2 日   ❤️ 1
    @kyrre #16
    grep -P
    kyrre
        20
    kyrre  
    OP
       2017 年 3 月 2 日
    @54c3 233333
    你真机灵,可惜这种解法不具备通用性,字符串随机一点你就没辙了。
    lianyue
        21
    lianyue  
       2017 年 3 月 2 日
    js
    /(^|\n)((?:(?!hede).)+)(?=\n|$)/g

    ..其他的 支持 后断言 的

    /(?<=^|\n)(?:(?!hede).)+(?=\n|$)/g
    kyrre
        22
    kyrre  
    OP
       2017 年 3 月 2 日
    @hellogbk 好吧,我的是 mac ,没有-P 这个选项。
    mdzz
        23
    mdzz  
       2017 年 3 月 2 日
    LZ 可能是想要一个 ABAB 叠字的正则
    kyrre
        24
    kyrre  
    OP
       2017 年 3 月 3 日
    @mdzz 不是,我只是想要个通用的能够过滤掉某些行的方案,用纯正则表达式
    kyrre
        25
    kyrre  
    OP
       2017 年 3 月 3 日
    @hellogbk 在 linux 下成功了。
    kyrre
        26
    kyrre  
    OP
       2017 年 3 月 3 日
    感谢版上的 V 友热心支招。特别感谢 @hellogbk 的解答。这个问题是由于阿里日志服务的一个坑引发的。
    https://www.v2ex.com/t/344400
    nicevar
        27
    nicevar  
       2017 年 3 月 3 日
    正则功力几乎为 0 ,每次都是用的时候不断尝试,或者直接问同事
    flfwzgl
        28
    flfwzgl  
       2017 年 3 月 3 日
    `hoho
    hihi
    haha
    fahedewwf`.replace(/\n.*hede.*\n?/g, '\n')
    vwok
        29
    vwok  
       2017 年 3 月 3 日
    @langmoe #5 这个网站好玩
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   5632 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 08:55 · PVG 16:55 · LAX 00:55 · JFK 03:55
    ♥ Do have faith in what you're doing.