JSONPath正则表达式-不以开头

时间:2019-07-23 10:24:12

标签: json regex jsonpath

我的JSON(简体)如下:

[
    {"name" : "foobar",
      "id" : 123
    },
    {"name" : "bar",
      "id" : 123
    },
    {"name" : "foobar",
      "id" : 456
    }, ...
]

我正在使用https://jsonpath.herokuapp.com/来尝试找到正确的JSONPATH语法,以过滤出从foo开始并具有id == 123的所有 not

获取它来过滤要做foo开头的内容很容易:

$..[?(@.name =~ /foo.*/i)]

这将产生以下结果:

[
   {
      "name" : "foobar",
      "id" : 123
   },
   {
      "name" : "foobar",
      "id" : 456
   }
]

我可以通过添加其他过滤器来消除ID 456,例如:

$..[?(@.name =~ /foo.*/i && @.id==123)]

但是,与以foo开头的名称相反,我该怎么做?我希望所有不以foo开头的实体。

我尝试过这样的事情:

$..[?(!@.name =~ /foo.*/i && @.id==123)]

至少将其解析为有效的JSONPATH,并且应该将过滤器取反,但是由于某种原因,它仍然很乐意仅报告foobar条目:

[
   {
      "name" : "foobar",
      "id" : 123
   }
]

如何在JSONPATH中实现NOT LIKE

谢谢!

2 个答案:

答案 0 :(得分:1)

正则表达式以识别不是以给定字符串foo开头的数据:

^([^f]|f[^o]|fo[^o])

如果您的正则表达式引擎支持负前瞻,则减少为

^(?!foo)

请注意将允许的匹配位置限制为测试字符串开头的起始锚(^)。

答案 1 :(得分:0)

感谢@collapsar朝正确的方向推动我,因为解决它的关键在于正则表达式(但特别是使用JavaScript正则表达式语法,并将其与JSONPath语法合并)。

实际上最终能解决问题的方法是更仔细地阅读documentation for JASONPath。它指出:

  

=〜
  匹配JavaScript正则表达式。例如,[?(@。description =〜/cat.*/i)]匹配描述以cat开头的项目(不区分大小写)。

注意:使用“就绪”的位置不支持! API 1.1。

Javascript Regular Expression的链接包含以下内容:

  

[^ xyz]
  否定或补充的字符集。也就是说,它匹配方括号中未包含的任何内容。您可以使用连字符指定字符范围。正常字符集中所有可用的内容也可以在这里使用。

     

例如,[^ abc]与[^ a-c]相同。他们最初在“胸围”中匹配“ r”,在“印章”中匹配“ h”。

有效的结果表达式为:

$..[?(@.name =~ /[^foo].*/ && @.id == 123)]

结果:

[
   {
      "name" : "bar",
      "id" : 123
   }
]

(我在拥有的JSON有效负载中添加了附加的barid 456,以再次检查过滤器是否也有效)。

相关问题