V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
einvince
V2EX  ›  问与答

用正则解析 json

  •  
  •   einvince · 2017-04-24 20:52:20 +08:00 · 2942 次点击
    这是一个创建于 2789 天前的主题,其中的信息可能已经有所发展或是发生改变。

    要处理 json 日志文件,因为特殊原因不能使用 json 直接解析,只能只用正则表达式 现在遇到的问题是,每个 json 语句里的 key ,不完全一样,比如 uid ,有的有,有的没有 应该怎么写这样的正则,判断下存不存在,如果存在就匹配?

    12 条回复    2017-04-25 19:31:20 +08:00
    kyuuseiryuu
        1
    kyuuseiryuu  
       2017-04-24 22:03:42 +08:00
    歪个楼:比较好奇是什么特殊原因
    geelaw
        2
    geelaw  
       2017-04-24 22:12:48 +08:00
    麻烦学习一下计算理论再来想这么简单的限制下可不可能做得了。

    你的 JSON 必须符合一些特别精细的要求,以致该种内容可以用正则语言搞定才能用正则表达式。

    另外,你所谓的“存在就匹配”,你想匹配什么内容呢?
    sagaxu
        3
    sagaxu  
       2017-04-24 22:13:08 +08:00
    @kyuuseiryuu 一般这种所谓特殊原因,都是错的
    yangqi
        4
    yangqi  
       2017-04-24 22:23:18 +08:00
    正则不是用来解析的,不要想了
    einvince
        5
    einvince  
    OP
       2017-04-24 22:33:30 +08:00
    @geelaw @sagaxu @yangqi @kyuuseiryuu
    特殊的原因是想使用阿里云的日志服务
    因为想把历史的日志都传过去,所以时间不能使用系统时间,得使用日志里的时间,直接使用 json 格式上传,阿里需要提供 time 的 key 来获得 time ,尴尬的是,现在是日志格式是
    2017-03-24:{
    x:1
    y:2
    z:3
    }
    时间是 key ,不是 value
    除了 json 之外,还可以使用正则提取,所以想用正则,但是每条日志里的 key 多少都不一样
    kyuuseiryuu
        6
    kyuuseiryuu  
       2017-04-24 22:38:33 +08:00
    @einvince 遍历 keyset 啊,如果 key 对应的 value 还是个 object , 那就递归进去遍历咯。然后对于每个 value 类型 活着 key 类型写判断对应的处理方法。
    sagaxu
        7
    sagaxu  
       2017-04-24 22:44:21 +08:00
    @einvince 你这根本就不是 json 格式, key 作为 string ,竟然没有放在引号里面。如果用 YAML ,或许能通过校验。
    geelaw
        8
    geelaw  
       2017-04-24 22:45:15 +08:00
    那并不是你不能用一般的方式解析 JSON ,只是你不想。 Case closed.
    sunjourney
        9
    sunjourney  
       2017-04-25 09:13:03 +08:00
    正则解析 json 做不到的,除非格式全部一致(也就是你能保证全是你列的格式, key 的数目和顺序一致),更何况你写的都不是 json 。最主要解析完你是存成什么,存的数据格式的语言不支持 json parse ? 可以说来听听?你能好好分析一下的话可以自己写 log parser ,每行用正则匹配一下还是可以的
    einvince
        10
    einvince  
    OP
       2017-04-25 10:35:13 +08:00
    @sunjourney
    http://ok68fpa49.bkt.clouddn.com/%E5%BE%AE%E4%BF%A1%E6%88%AA%E5%9B%BE_20170425103403.png
    http://ok68fpa49.bkt.clouddn.com/%E5%BE%AE%E4%BF%A1%E6%88%AA%E5%9B%BE_20170425103021.png
    看图,使用阿里的日志服务,它提供了 json 格式,但是我们的 time 是 key ,所以不能用这个
    只能用正则提取,然后让它给转换,但是每条日志的格式不一致,就像 uid ,用户未登陆就没有
    sunjourney
        11
    sunjourney  
       2017-04-25 14:55:24 +08:00
    time 不是 key , time 后面括号里的是 json ,你写在 5 楼的不是 json , json 的 key 必须有双引号。那个 time 的作用是告诉你那个时间的的日志 json ,不要当成 json 本身,你给的图的信息足够转换了,用日期正则把日期捕获删掉解析剩下的或者把日期后面的捕获了解析就成了。
    einvince
        12
    einvince  
    OP
       2017-04-25 19:31:20 +08:00
    @sunjourney 谢谢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1517 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 16:51 · PVG 00:51 · LAX 08:51 · JFK 11:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.