使用`Regexp`重新格式化字符串,命名为capture,以及`String#%`

时间:2015-08-25 22:40:11

标签: ruby regex

有没有人知道直接使用包含命名捕获的MatchData对象作为String模板格式化操作(%)的输入的方法?当我尝试这样做时,我得到一个“位置args与命名args混合”错误。

s  = "One-Two-Three"
re = /(?<first>.*?)-(?<second>.*?)-(?<third>.*)/
puts "%{second}" % s.match(re)

我找到了其他方法来实现功能目标(即通过以所需顺序创建捕获数组并使用位置模板),但代码相对笨拙。

3 个答案:

答案 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"}