如何调整json值的提取?

这个目前使用的正则表达式
[:]\s(\".*\")|\d+

可以提取到双引号中内容和数字,但无法提取单引号包括的value和纯字符的value。json示例

https://regex101.com/r/EsoMqY/1

阅读 2.2k
3 个回答

(?<=:\s?)(\d+|\"[^\"]*\"|true|false|null)

(?<=:) 匹配以 : 开头,但是不包含 : 的字符
(?<=:\s?) 匹配以 : 开头,并且后面可能有空白符,但是不包含 : 和空白符的字符
\"[^\"]*\" 匹配一个对称 " 字符及其中的内容

这里没有匹配数组和对象,数组和对象可以自行嵌套,没想到怎么写


修改 \d -> \d+

我只想说,如果有单引号,那就不是 JSON。参阅:https://www.json.org/。另外,如果想兼容一些特殊的约定,比如单引号民,纯字符什么的,既然不是标准 JSON,当然不能用现成的工具。用正则表达式算是一种取巧的方式,但不能解决所有问题。要想覆盖全面一点,就需要写真正的语法分析器。

比如说,用 ['\"] 代替 \" 就可以解决单/双引号的问题,但是解决不了引号匹配,更解决不了引号嵌套。


如果是标准 JSON,就不用自己去解析这么麻烦了,在 JS 里直接用 JSON.parse() 不是很方便?如果是其他语言一般也会有相应的 JSON 序列化库,比如 .NET 的 Newtonsoft Json.NET,Java 的 Gson,Jackson 等

试试将原来的正则表达式修改成如下形式,以匹配单引号包括的值和纯字符的值:
[:]\s(\".\")|(\'1\'|2+)


  1. \'
  2. \'\",{}[]\s
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏