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

考验一下你的正则功力

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

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

    我只能暗暗佩服自己的机智
    29 条回复    2017-03-03 13:58:03 +08:00
    kyrre
        1
    kyrre  
    OP
       2017-03-02 18:20:59 +08:00
    目前搜到离答案最近的是
    http://stackoverflow.com/questions/406230/regular-expression-to-match-a-line-that-doesnt-contain-a-word
    但悲剧的是我自己用
    grep '^((?!hede).)*$' b.txt
    居然没用。
    des
        2
    des  
       2017-03-02 18:26:02 +08:00 via Android
    @kyrre egrep ??
    54c3
        3
    54c3  
       2017-03-02 18:38:16 +08:00   1
    54c3
        4
    54c3  
       2017-03-02 18:39:54 +08:00
    @54c3 Updated, h([^e])h\1 will do the work.
    https://regex101.com/r/aQUufT/2
    langmoe
        5
    langmoe  
       2017-03-02 18:44:06 +08:00   5
    http://regex.alf.nu/
    考验功力上这个啊
    hellogbk
        6
    hellogbk  
       2017-03-02 19:21:17 +08:00
    ^(?!.*hede.*).*$
    ProkillerJ
        7
    ProkillerJ  
       2017-03-02 19:33:00 +08:00
    5 楼那个网站已经把正则玩出花了,不怕虐的可以去试一下
    DiamondbacK
        8
    DiamondbacK  
       2017-03-02 19:41:41 +08:00
    Use `grep -P pattern`.
    wojiaodaxiaxia
        9
    wojiaodaxiaxia  
       2017-03-02 19:49:55 +08:00
    6 楼应该是最准确直观的答案了吧
    loading
        10
    loading  
       2017-03-02 19:58:32 +08:00
    @hellogbk 的答案是我第一感觉的答案,楼主,下一题吧。
    kinghs
        11
    kinghs  
       2017-03-02 20:21:58 +08:00 via iPhone
    ^(?!.*hede).*$
    ColinZeb
        12
    ColinZeb  
       2017-03-02 21:41:48 +08:00
    @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-03-02 21:57:28 +08:00
    @langmoe 这个分数是越低越好?
    pysama
        14
    pysama  
       2017-03-02 22:12:05 +08:00
    /^(?!.*hede).*$/gi
    pysama
        15
    pysama  
       2017-03-02 22:12:28 +08:00
    @hellogbk 哟,我们的答案好像是一样的
    kyrre
        16
    kyrre  
    OP
       2017-03-02 22:16:37 +08:00
    且慢点赞。

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

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

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

    ..其他的 支持 后断言 的

    /(?<=^|\n)(?:(?!hede).)+(?=\n|$)/g
    kyrre
        22
    kyrre  
    OP
       2017-03-02 22:30:36 +08:00
    @hellogbk 好吧,我的是 mac ,没有-P 这个选项。
    mdzz
        23
    mdzz  
       2017-03-02 23:29:54 +08:00
    LZ 可能是想要一个 ABAB 叠字的正则
    kyrre
        24
    kyrre  
    OP
       2017-03-03 06:49:42 +08:00
    @mdzz 不是,我只是想要个通用的能够过滤掉某些行的方案,用纯正则表达式
    kyrre
        25
    kyrre  
    OP
       2017-03-03 07:43:43 +08:00
    @hellogbk 在 linux 下成功了。
    kyrre
        26
    kyrre  
    OP
       2017-03-03 07:47:10 +08:00
    感谢版上的 V 友热心支招。特别感谢 @hellogbk 的解答。这个问题是由于阿里日志服务的一个坑引发的。
    t/344400
    nicevar
        27
    nicevar  
       2017-03-03 11:22:23 +08:00
    正则功力几乎为 0 ,每次都是用的时候不断尝试,或者直接问同事
    flfwzgl
        28
    flfwzgl  
       2017-03-03 12:48:29 +08:00
    `hoho
    hihi
    haha
    fahedewwf`.replace(/\n.*hede.*\n?/g, '\n')
    vwok
        29
    vwok  
       2017-03-03 13:58:03 +08:00
    @langmoe #5 这个网站好玩
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     904 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 23:25 PVG 07:25 LAX 15:25 JFK 18:25
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86