【问题标题】:Regex to match key value pairs from JSON正则表达式匹配来自 JSON 的键值对
【发布时间】:2021-01-22 19:42:03
【问题描述】:

我需要匹配复杂 JSON 中的所有键值对,但只匹配文本/字符串的值。

例如来自:

{"results":[
{"id":16,"name":"some name1","location":"some  location1","parent":true, ,"region":"some region"},
{"id":157,"name":"some name2" , "location":some location2","parent":true}
],"totalCount":170}

我需要匹配:

"name" 
"some name1"
"location"
"some location1"
"region"
"some region1"
etc

我有这个 [^:]+\"(?=[,}\s]|$) ,但它只匹配值(这是正确的)。

我还需要匹配键:“name”、“location”、“region”(并且可以有其他键名)

这里是匹配值的示例https://regex101.com/r/m8FePZ/6

【问题讨论】:

  • 使用RegEx吗?在 99.9% 的情况下,您不应该使用 RegEx 以标准化的机器可读格式解析某些内容,例如 JSON(或 HTML、XML 等)。您应该使用您的编程语言的本机 JSON 解析器。您在哪种语言/环境中工作?
  • 只是出于好奇:为什么不只解析和遍历键?微优化?还是处理极其庞大的数据集?
  • 不要尝试使用正则表达式解析 JSON。你以后会后悔的。有很多你没有想到的边缘情况和可能出错的事情。在您使用的任何语言中使用适当的 JSON 解析器。
  • 如果你是从 shell 做一些事情,那么看看像 jq 这样的工具。这是我写的an article,其中包含一个关于如何使用jq 的简短示例。
  • 感谢 cmets。我使用 JAVA,但我可以用任何语言来做。如果正则表达式出现问题(仅用于测试目的),则数据并不重要。我想做一个小脚本来解析任何多级 json 对象并通过添加键和随机数来混淆值。不知道 JSON 将包含什么。我查看了不同的库,但没有一个能帮助我实现这一点并使用 Jackson 解析它,例如,将其转换为 Map 意味着在 JSON 内的所有级别中下降,这可能有点复杂。

标签: json regex


【解决方案1】:

正如其他人指出的那样,如果您想要一个强大的解决方案,请使用您的语言中的 JSON 解析器。

如果你想使用正则表达式,并且引擎支持lookbehind,你可以使用这个:

/("[^"]*"(?=:")|(?<=":)"[^"]*")/g

解释:

  • | - 或以下组合:
    • "[^"]*"(?=:") - 引用,0+ 非引号,引用,后跟冒号和引用的正向预测
    • (?&lt;=":)"[^"]*" - 正向查找引号和冒号,后跟引号,0+ 非引号,引号

如果您想排除匹配中的引号,请使用此正则表达式:

/(?<=")([^"]*(?=":")|(?<=":")[^"]*)/g

请注意,这些正则表达式无法覆盖极端情况,例如键和值周围的空格、值中的转义引号等。因此使用实际的 JSON 解析器会更安全。

【讨论】:

    猜你喜欢
    • 2016-08-28
    • 2023-01-23
    • 1970-01-01
    • 2019-08-17
    • 2018-04-23
    • 1970-01-01
    • 2013-02-13
    • 2012-04-30
    • 2017-03-20
    相关资源
    最近更新 更多