如何使用正则表达式搜索 JSON 哈希?
Posted
技术标签:
【中文标题】如何使用正则表达式搜索 JSON 哈希?【英文标题】:How to search a JSON hash using a Regex? 【发布时间】:2021-12-31 21:13:43 【问题描述】:我正在使用 API 将所有宏返回给我,我正在尝试返回所有“宏”,其中“动作”包含与我的正则表达式模式匹配的“值”,我将在下面链接。
我尝试了以下方法和其他方法,但它返回的当前值为零。任何提示表示赞赏
macros["value"].select |m| m['key'] == 'value' .first['/^DE([0-9a-zA-Z]\s?)20$/gm']
API结果sn-p:
jsObj
=> "macros"=>
["url"=>"https://s/1900002708354.json",
"id"=>1900002708354,
"title"=>"Append Signature",
"active"=>true,
"updated_at"=>"2021-10-22T14:11:15Z",
"created_at"=>"2021-10-22T14:11:15Z",
"position"=>10001,
"description"=>"This macro appends a signature to the message ",
"actions"=>["field"=>"comment_value_html", "value"=>"<p>Mit besten Grüßen,</p><p>current_user.name [ticket.account] <br></p><p><br></p><p>dc.signature_email<br></p><p><br></p>"],
"restriction"=>nil,
"url"=>"949.json",
"id"=>59071949,
"title"=>"information",
"description"=>nil,
"actions"=>["field"=>"priority", "value"=>"low", "field"=>"comment_value", "value"=>"DE89370400440532013000" "DE89 3704
0044 0532 0130 00"
"],
"restriction"=>nil,
期望的结果:
"macros": [
"url": "x.json",
"id": 1900002708354,
"actions": [
"field": "comment_value_html",
"value": "DE89 3704 0044 0532 0130 00"
],
"restriction": null
,
"url": "x.json",
"id": 59071949,
"actions": [
"field": "priority",
"value": "low"
,
"field": "comment_value",
"value": "DE89 3704 0044 0532 0130 00
"
],
"restriction": null
,
【问题讨论】:
无论何时给出示例,请显示所需的结果,此处为有效的 Ruby 对象(例如,数组或哈希)。请注意,"IBANS"
不会出现在 JSON 中(仅"IBAN"
)。 “宏”是什么意思?
@CarySwoveland 感谢您的提示,我已经更新了所需的结果。在这种情况下,一个宏在各种文本模板中,如上面的 API 响应所示,上面我有一个包含 3 个宏的 sn-p。
还是有点不清楚。也许您需要的只是获取macros
,其中actions
包含与您的模式匹配的value
?见ideone.com/JWT8Xr
@WiktorStribiżew 是的,这正是我想要的,我会更新以使其更清晰,谢谢。
【参考方案1】:
鉴于macros
是包含macros
数据的JSON 对象,您可以使用
macros.select |m| m["actions"].any? |w| /\ADE(?:[0-9a-zA-Z]\s?)20\z/.match?(w["value"])
这是一个 Ruby 演示:
require 'json'
j = <<-DATA
"macros": [
"url": "x.json",
"id": 1900002708354,
"actions": [
"field": "comment_value_html",
"value": "DE11111111111222222220"
],
"restriction": null
,
"url": "x.json",
"id": 59071949,
"actions": [
"field": "priority",
"value": "low"
,
"field": "comment_value",
"value": "DE12345678901234567890"
],
"restriction": null
]
DATA
jsObj = JSON.parse(j)
macros = jsObj['macros']
puts jsObj['macros'].select |m| m["actions"].any? |w| /\ADE(?:[0-9a-zA-Z]\s?)20\z/.match?(w["value"])
输出:
"url"=>"x.json", "id"=>1900002708354, "actions"=>["field"=>"comment_value_html", "value"=>"DE11111111111222222220"], "restriction"=>nil
"url"=>"x.json", "id"=>59071949, "actions"=>["field"=>"priority", "value"=>"low", "field"=>"comment_value", "value"=>"DE12345678901234567890"], "restriction"=>nil
.select |m| m["actions"].any? |w| /\ADE(?:[0-9a-zA-Z]\s?)20\z/.match?(w["value"])
主要部分获取所有 actions
节点,这些节点包含一个数组,该数组带有一个 value
键,其值与给定的正则表达式匹配。
【讨论】:
感谢您的回答,但是,尽管它与您给定的链接一起使用,但它为我返回了空数组。似乎无法到达 value 键,因为没有 Regexp 返回非空结果。 值被称为 NilClass @cdln 这意味着你没有提供你所拥有的 JSON。 奇怪,我从 Postman 那里拿了打印出来的结果。我用jsobj的值更新了sn-p,应该是准确的。 就是这样。我会尽量让我的问题更简洁+清楚地说明未来的问题,感谢您的帮助。以上是关于如何使用正则表达式搜索 JSON 哈希?的主要内容,如果未能解决你的问题,请参考以下文章
如何创建正则表达式来查找 JS 文件(或 JSON)中的所有字符串