jayway JsonPath + ruby​​ regexp

时间:2015-08-13 14:32:32

标签: json regex jsonpath

我几乎是正则表达式的新手。

我正在使用jaywayruby regexp编写JsonPath表达式 我想通过仅匹配书籍作者属性的前2个字母来找到节点

实际表达

$..book[?(@.author =~ /\A.{0}(Ni).*/)]

找到我需要的东西

[
   {
      "category" : "reference",
      "author" : "Nigel Rees",
      "title" : "Sayings of the Century",
      "price" : 8.95
   }
]

{
"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": "Herman Melville",
            "title": "Moby Dick",
            "isbn": "0-553-21311-3",
            "price": 8.99
        },
        {
            "category": "fiction",
            "author": "J. R. R. Tolkien",
            "title": "The Lord of the Rings",
            "isbn": "0-395-19395-8",
            "price": 22.99
        }
    ],
    "bicycle": {
        "color": "red",
        "price": 19.95
    }
},
"expensive": 10

}

对于那种情况,你知道更干净的正则表达式吗?实际的正则表达式中应该添加或不应该添加什么内容?

1 个答案:

答案 0 :(得分:0)

让我试一试。

正则表达式/\A.{0}(Ni).*/表示:

  1. \A - 匹配字符串的开头
  2. .{0} - 匹配任何字符,但新行完全匹配0次
  3. (Ni) - 匹配并捕获到第1组文字Ni
  4. .* - 尽可能多地匹配换行符以外的0个或多个字符
  5. 您只需检查与=~的匹配。

    不必要的部分是第1点和第2点。删除\A,因为表达式默认是锚定的。删除.{0}因为没有意义。

    .*似乎是必要的,因为表达式应与整个字符串匹配。作为一个小改进,从(Ni)中删除括号,因为您没有使用任何反向引用。请注意,从逻辑的角度来看,使用正则表达式捕获/存储我们已经知道的东西是没有意义的,除非有一些特定的目的(例如将字符串拆分成数组)。

    因此,请使用

    $..book[?(@.author =~ /Ni.*/)]
    

    请注意,添加/i修饰符会使表达式匹配以ni开头的值。