jayway JsonPath + ruby 正则表达式

jayway JsonPath + ruby regexp

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

我正在使用 jayway and ruby 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

}

你知道那种情况下更干净的正则表达式吗?什么是不必要的或应该添加到实际的正则表达式中?

我来试试

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

  1. \A - 匹配字符串的开头
  2. .{0} - 匹配除换行符以外的任何字符 0 次
  3. (Ni) - 匹配并捕获到第 1 组文字文本 Ni
  4. .* - 尽可能匹配除换行符以外的 0 个或多个字符

你只需检查与 =~ 的匹配项。

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

.* 似乎是必要的,因为表达式应该匹配整个字符串。作为一个小的改进,从 (Ni) 中删除括号,因为您没有使用任何反向引用。请注意,从逻辑的角度来看,capture/store 是毫无意义的,除非有一些特定的目的(例如,将字符串拆分为数组)。

因此,使用

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

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