Regex匹配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","位置","地区";(可以有其他键名)

下面是一个匹配值的示例https://regex101.com/r/m8FePZ/6

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

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

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

解释:

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

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

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

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

我看到你最后决定不使用regex而使用JSON库。以下是"乔森"提出的简单解决方案。Jossons" .

https://github.com/octomix/josson

implementation 'com.octomix.josson:josson:1.3.22'
---------------------------------------------
Josson josson = Josson.fromJsonString(
"{n" +
"    "results": [n" +
"        {n" +
"            "id": 16,n" +
"            "name": "some name1",n" +
"            "location": "some location1",n" +
"            "parent": true,n" +
"            "region": "some region"n" +
"        },n" +
"        {n" +
"            "id": 157,n" +
"            "name": "some name2",n" +
"            "location": "some location2",n" +
"            "parent": truen" +
"        }n" +
"    ],n" +
"    "totalCount": 170n" +
"}");
JsonNode node = josson.getNode(
"results.entries().[value.isText()]*.toArray()");
System.out.println(node.toPrettyString());

输出
[ "name", "some name1", "location", "some location1", "region", "some region", "name", "some name2", "location", "some location2" ]

最新更新