我有一个字符串,由 *nix "hostname"命令填充,我需要解析它以获得一个数字。这是最简单的部分。困难来自需要对捕获的数字进行 Math(tm)。显然,正则表达式捕获始终是 MatchData 类型,它没有任何数学函数,如“add”或“modulo”,也没有“.to_i”的方法。目前,为了对捕获的数字进行 Math(tm),我需要使用 MatchData 的 .to_s 方法将捕获转换为字符串,然后使用 String 的 .to_i 使其成为整数。我的问题是,这样做的更好方法是什么?
hostname = "webserver1337.mycorp.com"
number = hostname.match(/[a-z]+/)
puts "#{number}, with class #{number.class}" # prints '1337, with class MatchData'
somevar = number + 1 # this will fail horribly
temp1 = number.to_s
number = temp1.to_i
someothervar = number + 1
puts "#{number}, #{someothervar} with class #{number.class}" # prints '1337, 1338 with class FixNum'
这……有点难看。是否有更好/更清洁的方法来实现同样的目标?
最佳答案
MatchData
对象将使用 []
返回匹配项中包含的字符串。例如:
hostname = "webserver1337.mycorp.com"
m = hostname.match( /([a-z]+)(\d+)/ )
number = m[2].to_i + 1
p m[0], m[1], m[2], number
一次性完成:
number = hostname.match(/\d+/)[0].to_i + 1
关于Ruby 正则表达式 MatchData 到整数转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2418773/