json - 正则表达式匹配来自 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
解决方案
正如其他人指出的那样,如果您想要一个强大的解决方案,请使用您的语言中的 JSON 解析器。
如果你想使用正则表达式,并且引擎支持lookbehind,你可以使用这个:
/("[^"]*"(?=:")|(?<=":)"[^"]*")/g
解释:
|
- 或以下组合:"[^"]*"(?=:")
- 引号,0+ 非引号,引号,后跟冒号和引号的正向前瞻(?<=":)"[^"]*"
- 正向查找引号和冒号,后跟引号,0+ 非引号,引号
如果要排除匹配中的引号,请使用此正则表达式:
/(?<=")([^"]*(?=":")|(?<=":")[^"]*)/g
请注意,这些正则表达式无法覆盖极端情况,例如键和值周围的空格、值中的转义引号等。因此使用实际的 JSON 解析器更安全。
推荐阅读
- python - CNN Pytorch 仅支持空间目标批次的错误
- javascript - Vue JS Make下拉选择在选择选项时运行查询
- asp.net - 文件名的 Ajax 工具包问题(文件名中的非法字符)
- php - 这是 Json 数据、XML 还是数组?
- javascript - 在 Mongoose 中引用另一个 Schema
- laravel - Laravel,修改集合只保存最后一个值
- firebase - 为什么我的用户详细信息没有保存到实时数据库中?
- json - 如何仅提取 JSON 的一部分并在 .netcore 中对其进行反序列化
- gitlab - 带有令牌的 Gitlab CI 管道
- c - strsep() 与 strtok_r() 的优先使用