如何使用正则表达式在JSON哈希中查找匹配的Macros条目?
问题原因
你的原有写法存在3个核心逻辑错误:
- 数据结构读取错误:API返回的根节点下
macros是数组,不存在顶层的value键,macros["value"]本身就会返回nil - 正则使用方式错误:Ruby中不能把正则表达式当做哈希的键来取值,正则匹配需要用
=~或者match?方法 - 缺少遍历逻辑:没有遍历每个macro下的
actions数组,无法校验每个action的value是否符合规则
解决代码
# 定义目标正则,m修饰符开启多行匹配适配含换行的value target_regex = /^DE([0-9a-zA-Z]\s?){20}$/m # 筛选符合条件的macro条目 filtered_macros = jsObj["macros"].select do |macro| # 只要actions数组中存在任意一个value匹配正则,就保留当前macro macro["actions"].any? do |action| # to_s避免value为nil时抛出异常,可根据需要加.strip去除首尾空白 action["value"].to_s.match?(target_regex) end end # 按你期望的格式封装返回结果 result = { "macros" => filtered_macros }
适配调整建议
- 如果你的目标字符串前后存在多余的空格、换行,可以把匹配逻辑改为
action["value"].to_s.strip.match?(target_regex),同时可以去掉正则首尾的^和$锚点降低匹配限制 - 如果你需要的是只保留每个macro里符合匹配的action,过滤掉不符合的action,可以用以下逻辑处理:
filtered_macros = jsObj["macros"].map do |macro| # 筛选当前macro下符合规则的actions matched_actions = macro["actions"].select { |a| a["value"].to_s.match?(target_regex) } # 只有存在匹配的action时才保留该macro matched_actions.any? ? macro.merge("actions" => matched_actions) : nil end.compact
内容的提问来源于stack exchange,提问作者user16741832
相关产品推荐
相关产品推荐

