V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
CivAx
V2EX  ›  程序员

指出一个 FileBeat 官方文档里一个正则表达式的坑

  •  
  •   CivAx · 2019-10-14 16:07:21 +08:00 · 1838 次点击
    这是一个创建于 1869 天前的主题,其中的信息可能已经有所发展或是发生改变。

    文档地址:https://www.elastic.co/guide/en/beats/filebeat/6.3/_examples_of_multiline_configuration.html (对,我知道是旧文档,因为新文档里完全改写——实际上是缩写了这个页面)

    在匹配 Java 堆栈报错日志的时候,官方文档建议的正则式是

    正则式 ↓:

    '^[[:space:]]+(at|\.{3})\b|^Caused by:'
    

    那么按照文档,去 https://regex101.com/ 使用 Go 语言匹配模式测试一下

    匹配文 ↓:(照顾页面美观缩短了一下)

            at org.mybatis.sping.invoke(SqlSessionTemplate.java:433) ~[mybatis-spring-1.3.2.jar!/:1.3.2]
            ... 89 more
    

    测试结果: https://i.imgur.com/2JoxHXy.png

    明显最后那行是没匹配上的。

    变换着正则模式捣鼓了一小会儿(我正则几乎 0 基础,结论可能有错),疑似是 "..." 与它和 "89" 之间的空格同为符号(非单词),不能正确被 "\b" 识别与切割,因为去掉 "\b" 后,这条正则是可以工作的。

    那么按照我的理解,这条正则的正确写法应该是 ↓:

    ^[[:space:]]+(at)\b|(\.{3})\B|^Caused by:
    

    不过这么写,根据测试,匹配速度会在原公式的基础上慢到翻倍,因为要适配两个 Group。如果直接去掉 "\b" 的话匹配上看起来没问题,没有丢文本(不敢确定),速度也是正常速度。

    4 条回复    2019-10-14 17:43:16 +08:00
    airfling
        1
    airfling  
       2019-10-14 16:15:28 +08:00
    一个是 java,一个是 go,不要这么说好不,不同语言解析的正则稍微有点差别
    CivAx
        2
    CivAx  
    OP
       2019-10-14 16:19:33 +08:00
    @airfling #1 FileBeat 是 Golang 写的,所以我在 RegEx101 里用 Golang 模式来匹配;官方文档是针对 "Java stack traces" 拟的文档,请问我说的有什么问题。
    Bromine0x23
        3
    Bromine0x23  
       2019-10-14 17:28:58 +08:00   ❤️ 1
    示例应该是错的,不过正确写法应该是 `^[[:space:]]+(?:at\b|\.{3}\B)|^Caused by:` 吧

    `^[[:space:]]+(at)\b|(\.{3})\B|^Caused by:` 实际上是三个子模式的并(`^[[:space:]]+(at)\b`、`(\.{3})\B`、`^Caused by:`)
    CivAx
        4
    CivAx  
    OP
       2019-10-14 17:43:16 +08:00
    @Bromine0x23 #3 这个好快,比官方快 50% XD
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5782 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 01:37 · PVG 09:37 · LAX 17:37 · JFK 20:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.