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).*/
表示:
\A
- 匹配字符串的开头
.{0}
- 匹配除换行符以外的任何字符 0 次
(Ni)
- 匹配并捕获到第 1 组文字文本 Ni
.*
- 尽可能匹配除换行符以外的 0 个或多个字符
你只需检查与 =~
的匹配项。
不需要的部分是第 1 点和第 2 点。删除 \A
,因为表达式默认是锚定的。删除 .{0}
,因为它没有意义。
.*
似乎是必要的,因为表达式应该匹配整个字符串。作为一个小的改进,从 (Ni)
中删除括号,因为您没有使用任何反向引用。请注意,从逻辑的角度来看,capture/store 是毫无意义的,除非有一些特定的目的(例如,将字符串拆分为数组)。
因此,使用
$..book[?(@.author =~ /Ni.*/)]
请注意,添加 /i
修饰符也会使表达式匹配以 ni
开头的值。
我几乎是正则表达式的新手。
我正在使用 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).*/
表示:
\A
- 匹配字符串的开头.{0}
- 匹配除换行符以外的任何字符 0 次(Ni)
- 匹配并捕获到第 1 组文字文本Ni
.*
- 尽可能匹配除换行符以外的 0 个或多个字符
你只需检查与 =~
的匹配项。
不需要的部分是第 1 点和第 2 点。删除 \A
,因为表达式默认是锚定的。删除 .{0}
,因为它没有意义。
.*
似乎是必要的,因为表达式应该匹配整个字符串。作为一个小的改进,从 (Ni)
中删除括号,因为您没有使用任何反向引用。请注意,从逻辑的角度来看,capture/store 是毫无意义的,除非有一些特定的目的(例如,将字符串拆分为数组)。
因此,使用
$..book[?(@.author =~ /Ni.*/)]
请注意,添加 /i
修饰符也会使表达式匹配以 ni
开头的值。