• 请不要在回答技术问题时复制粘贴 AI 生成的内容
kyrre
V2EX  ›  程序员

考验一下你的正则功力

  •  
  •   kyrre · Mar 2, 2017 · 5736 views
    This topic created in 3543 days ago, the information mentioned may be changed or developed.
    需求:
    有如下文本,需要找出不含“ hede “的行, 不要告诉我用 grep -v ,我要纯正则表达式。
    hoho
    hihi
    haha
    hede
    Supplement 1  ·  Mar 3, 2017
    这个问题的出处是我在用阿里的日志服务时发现它们的正则表达式只能取出要的行,没法剔除指定的行。开了工单,客服也没提出什么实际的解决方案,我以为他们的系统就这样了。
    写复杂的排除正则也是没办法的办法。

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

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

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

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

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

    ..其他的 支持 后断言 的

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