我几乎是正则表达式的新手。
我正在使用jayway和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
}
对于那种情况,你知道更干净的正则表达式吗?实际的正则表达式中应该添加或不应该添加什么内容?
答案 0 :(得分:0)
让我试一试。
正则表达式/\A.{0}(Ni).*/
表示:
\A
- 匹配字符串的开头.{0}
- 匹配任何字符,但新行完全匹配0次(Ni)
- 匹配并捕获到第1组文字Ni
.*
- 尽可能多地匹配换行符以外的0个或多个字符您只需检查与=~
的匹配。
不必要的部分是第1点和第2点。删除\A
,因为表达式默认是锚定的。删除.{0}
因为没有意义。
.*
似乎是必要的,因为表达式应与整个字符串匹配。作为一个小改进,从(Ni)
中删除括号,因为您没有使用任何反向引用。请注意,从逻辑的角度来看,使用正则表达式捕获/存储我们已经知道的东西是没有意义的,除非有一些特定的目的(例如将字符串拆分成数组)。
因此,请使用
$..book[?(@.author =~ /Ni.*/)]
请注意,添加/i
修饰符会使表达式匹配以ni
开头的值。