如何使用Jayway JsonPath通过正则过滤非'foo'开头的值
解决Jayway JsonPath筛选不以特定字符串开头的问题
你已经摸到门道啦,但这里有个正则表达式的小误区得修正下:你写的/^[^foo]/其实是匹配第一个字符不是f、o、o中任意一个的字符串,而不是你想要的不以"foo"开头的字符串——方括号[^...]是字符集否定,它会逐个排除里面的单个字符,而非排除整个字符串。
正确的JsonPath表达式
要筛选出不以"foo"开头的author,得用锚点^结合负向前瞻断言,表达式如下:
$..book[?(@.author =~ /^(?!foo).*/)].author
拆解下这个正则的逻辑:
^:锁定字符串的开头位置(?!foo):负向前瞻断言,确保当前位置后面紧跟着的不是"foo".*:匹配后续任意长度的字符(如果有的话)
用你的示例JSON测试验证
假设你的完整JSON结构是:
{ "store": { "book": [ { "category": "reference", "author": "Nigel Rees", "title": "Sayings of the Century", "price": 8.95 }, { "category": "fiction", "author": "Evelyn Waugh", "title": "Sword of Honour", "price": 12.99 }, { "category": "fiction", "author": "fooBar", "title": "Example Book", "price": 9.99 } ] } }
使用正确的表达式后,会返回结果:
["Nigel Rees", "Evelyn Waugh"]
那个以"foo"开头的fooBar会被精准排除,完全符合你的需求。
额外小提示
如果需要忽略大小写(比如同时排除以"FOO"、"Foo"开头的内容),可以在正则末尾加上i标志:
$..book[?(@.author =~ /^(?!foo).*/i)].author
内容的提问来源于stack exchange,提问作者Ducaz035




