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

文本 log 中含有部分 json,该如何取出?

  •  
  •   lyklykkkkkkk · 2016-03-21 21:50:28 +08:00 · 2873 次点击
    这是一个创建于 3167 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有 log 如下

    2016-03-21 21:36:20.878  INFO 17512 --- [main] This is going well
    ok: [goingwell] => {
        "localresult": {
    		"aa":"bb",
    		"aaa":"bbb"
        }
    }
    2016-03-21 21:36:30.878  INFO 17512 --- [main] Continue...
    2016-03-21 21:36:40.878  INFO 17512 --- [main] Logging ...
    

    如何得到 localresult={ aa:'bb', aaa:'bbb'}?

    假设用 java 语言。

    6 条回复    2016-03-23 10:48:19 +08:00
    knightdf
        1
    knightdf  
       2016-03-21 22:28:56 +08:00
    正则啊。。。
    singer
        2
    singer  
       2016-03-21 22:47:09 +08:00 via iPhone
    转成 json 格式,再取
    crystom
        3
    crystom  
       2016-03-22 00:00:13 +08:00
    不是时间戳开头的行取出来吧
    TaoAlpha
        4
    TaoAlpha  
       2016-03-22 01:11:20 +08:00   ❤️ 1
    正则走起~
    \{(?:[^{}]|(?R))*\}

    测试链接: https://regex101.com/r/pY9sD9/1
    bombless
        5
    bombless  
       2016-03-22 06:08:33 +08:00 via Android
    是我的话先用 awk 处理掉胖箭头和它之前的东西
    lyklykkkkkkk
        6
    lyklykkkkkkk  
    OP
       2016-03-23 10:48:19 +08:00
    更新:

    https://upload.wikimedia.org/wikipedia/commons/thumb/9/9a/Chomsky-hierarchy.svg/800px-Chomsky-hierarchy.svg.png

    按照上图乔姆斯基文法分类, Json 本身是上下文无关语法,高于正则表达式的表达能力,所以普通 regex 没有能力严格描述 Json ,甚至连括号匹配都无法完成。

    正则表达式的变种, PCRE ,支持更多模式,比如递归,可以描述大括号的匹配。如 @TaoAlpha 的解决方案。

    但 Java 的正则没有这么强,我也没有找到 Java 能用的 PCRE 库。所以四楼的正则表达式没法直接用,必须去掉递归,将递归降级成有限层次的递归匹配, Java 才能处理了(一般 json 嵌套也就三四层)。

    比如这样:
    https://regex101.com/r/aF7aH6/4
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1320 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 17:47 · PVG 01:47 · LAX 09:47 · JFK 12:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.