我有一个JSON格式的字符串,我正在尝试使用regex解析它。我想解析每个键值对,以便稍后在grafana中使用(正则表达式本身在logstash中使用(。
测试字符串如下所示:
{
"version":"1.1",
"nameId":"test",
"productId":"B2",
"total customers":99,
"full_description":"asdf"
}
我使用的是下面的正则表达式,但似乎如果值是一个数字(没有"(,它会将逗号分组在值中。例如键"0"的组值;总客户";是";99;而不仅仅是";99〃;。
(?i)["'](?<key>[^"]*)["'](?::)["'{[]?([rn]?t+")?(?<value>w(?:s[a-zA-Z0-9_=].?)+w+@(?:(?:w[a-zd-]+w).)+[a-z]{2,10}|true|false|[w+-.$s=-]*)(",[rn])?(?2)?(?J)(?<value>(?&value))?
为了解析作为数字的JSON值,我必须向regex表达式添加什么?
模式[w+-.$s=-]
中的这一部分具有范围+-.
,而不是与+
-
或.
匹配
该范围与ASCII字符小数43-46匹配,其中数字44与不需要的,
匹配
由于字符类在末尾已经与-
匹配,因此可以省略中间的-
。
该模式包含一些多余的逃脱和捕获组,看起来有点复杂。只有2个捕获组的更新模式可能看起来像;
(?i)["'](?<key>[^"]*)["']:["'{[]?(?:[rn]?t+")?(?<value>w(?:s[a-zA-Zd_=].?)+w+@(?:w[a-zd-]+w.)+[a-z]{2,10}|true|false|[w+.$s=-]*)(?:",[rn])?(?2)?(?J)(?<value>(?&value))?
Regex演示