有没有人知道直接使用包含命名捕获的MatchData
对象作为String模板格式化操作(%
)的输入的方法?当我尝试这样做时,我得到一个“位置args与命名args混合”错误。
s = "One-Two-Three"
re = /(?<first>.*?)-(?<second>.*?)-(?<third>.*)/
puts "%{second}" % s.match(re)
我找到了其他方法来实现功能目标(即通过以所需顺序创建捕获数组并使用位置模板),但代码相对笨拙。
答案 0 :(得分:1)
试试这个:
s = "One-Two-Three"
re = /(?<first>.*?)-(?<second>.*?)-(?<third>.*)/
match = s.match(re)
[match.names.map(&:to_sym), match.captures].transpose.to_h
# => {:first=>"One", :second=>"Two", :third=>"Three"}
答案 1 :(得分:0)
如何直接使用字符串插值:
puts "#{s.match(re)['second']}"
答案 2 :(得分:-1)
对于ruby&lt; 2.0你想使用Hash[]
:
m = s.match re
Hash[m.names.map(&:to_sym).zip m.captures]
#=> {:first=>"One", :second=>"Two", :third=>"Three"}