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