首页 > 解决方案 > 正则表达式匹配来自 JSON 的键值对

问题描述

我需要匹配来自复杂 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

标签: jsonregex

解决方案


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

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

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

解释:

  • |- 或以下组合:
    • "[^"]*"(?=:")- 引号,0+ 非引号,引号,后跟冒号和引号的正向前瞻
    • (?<=":)"[^"]*"- 正向查找引号和冒号,后跟引号,0+ 非引号,引号

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

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

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


推荐阅读