gpt4 book ai didi

ruby - 将 MatchData 中的命名匹配转换为哈希

转载 作者:数据小太阳 更新时间:2023-10-29 06:30:40 25 4
gpt4 key购买 nike

我有一个相当简单的正则表达式,但我想使用命名正则表达式使其更清晰,然后迭代结果。

测试字符串:

testing_string = "111x222b333"

我的正则表达式:

regexp = %r{
(?<width> [0-9]{3} ) {0}
(?<height> [0-9]{3} ) {0}
(?<depth> [0-9]+ ) {0}

\g<width>x\g<height>b\g<depth>
}x
dimensions = regexp.match(testing_string)

这项工作就像一个魅力,但问题出在这里:

dimensions.each { |k, v| dimensions[k] = my_operation(v) }

# ERROR !

undefined method `each' for #<MatchData "111x222b333" width:"111" height:"222" depth:"333">.

MatchData 对象中没有 .each 方法,我真的不想猴子修补它。

我该如何解决这个问题?

我并不像我想的那么清楚:重点是保留名称和类似散列的结构。

最佳答案

如果你需要一个完整的哈希:

captures = Hash[ dimensions.names.zip( dimensions.captures ) ]
p captures
#=> {"width"=>"111", "height"=>"222", "depth"=>"333"}

如果您只想遍历名称/值对:

dimensions.names.each do |name|
value = dimensions[name]
puts "%6s -> %s" % [ name, value ]
end
#=> width -> 111
#=> height -> 222
#=> depth -> 333

备选方案:

dimensions.names.zip( dimensions.captures ).each do |name,value|
# ...
end

[ dimensions.names, dimensions.captures ].transpose.each do |name,value|
# ...
end

dimensions.names.each.with_index do |name,i|
value = dimensions.captures[i]
# ...
end

关于ruby - 将 MatchData 中的命名匹配转换为哈希,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11688726/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com