【问题标题】:Regex to parse json formatted string正则表达式解析 json 格式的字符串
【发布时间】:2021-04-13 05:51:27
【问题描述】:

我有一个 JSON 格式的字符串,我正在尝试使用正则表达式对其进行解析。我想解析每个键值对以供以后在 grafana 中使用(正则表达式本身用于 logstash)。

测试字符串如下所示:

{
  "version":"1.1",
  "nameId":"test",
  "productId":"B2",
  "total customers":99,
  "full_description":"asdf"
}

我正在使用以下正则表达式,但似乎如果该值是一个数字(没有“”),它会将逗号分组在值中。例如,键“total customers”的组值是“99”,而不仅仅是“99”。

(?i)["'](?<key>[^"]*)["'](?:\:)["'\{\[]?([\r\n]?\t+\")?(?<value>\w(?:\s[a-zA-Z0-9_=]\.?)+\w+@(?:(?:\w[a-z\d\-]+\w)\.)+[a-z]{2,10}|true|false|[\w+-.$\s=-]*)(",[\r\n])?(?2)?(?J)(?<value>(?&value))?

为了解析数字的 JSON 值,我必须向正则表达式添加什么?

【问题讨论】:

  • 你试过什么?您可以使用\:"?(\d+)"?, 并取决于语言,您可以使用匹配的正则表达式组提取正则表达式
  • @SinhNguyen 我忘了显示我正在使用的正则表达式。为了使正则表达式起作用,我必须将 \:"?(\d+)"? 放在哪里?

标签: regex grafana logstash-grok


【解决方案1】:

模式[\w+-.$\s=-] 中的这部分有一个范围+-.,而不是匹配+ -.

范围匹配 ASCII 字符十进制数字 43-46,其中数字 44 匹配不需要的 ,

由于字符类已经匹配到末尾的-,所以可以省略中间的-

该模式包含一些多余的转义和捕获组,看起来有点复杂。仅包含 2 个捕获组的更新模式可能如下所示;

(?i)["'](?<key>[^"]*)["']:["'{\[]?(?:[\r\n]?\t+")?(?<value>\w(?:\s[a-zA-Z\d_=]\.?)+\w+@(?:\w[a-z\d-]+\w\.)+[a-z]{2,10}|true|false|[\w+.$\s=-]*)(?:",[\r\n])?(?2)?(?J)(?<value>(?&value))?

Regex demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-25
    • 2021-05-28
    • 2016-04-29
    • 2012-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多