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

2016-03-21 21:50:28 +08:00
 lyklykkkkkkk

有 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 语言。

2925 次点击
所在节点    程序员
6 条回复
knightdf
2016-03-21 22:28:56 +08:00
正则啊。。。
singer
2016-03-21 22:47:09 +08:00
转成 json 格式,再取
crystom
2016-03-22 00:00:13 +08:00
不是时间戳开头的行取出来吧
TaoAlpha
2016-03-22 01:11:20 +08:00
正则走起~
\{(?:[^{}]|(?R))*\}

测试链接: https://regex101.com/r/pY9sD9/1
bombless
2016-03-22 06:08:33 +08:00
是我的话先用 awk 处理掉胖箭头和它之前的东西
lyklykkkkkkk
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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/265267

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX