我想编写一个程序,它以23.0.23.345
的格式获取内部版本号(前两位,然后是点,然后是零,然后是点,然后是两位,点,三位):
number=23.0.23.345
pattern = /(^[0-9]+\.{0}\.[0-9]+\.[0-9]$)/
numbers.each do |number|
if number.match pattern
puts "#{number} matches"
else
puts "#{number} does not match"
end
end
输出: 我收到错误: 浮点文字在点之前变为零
答案 0 :(得分:4)
我使用类似的东西来查找匹配的模式:
number = 'foo 1.2.3.4 23.0.23.345 bar'
build_number = number[/
\d{2} # two digits
\.
0
\.
\d{2} # two more digits
\.
\d{3}
/x]
build_number # => "23.0.23.345"
此示例使用String的[/regex/]
方法,这是一种很好的简写方式来应用和返回正则表达式的结果。它仅以I' m使用的形式返回第一个匹配项。阅读文档以获取更多信息和示例。
你的模式不会起作用,因为它没有做你认为它做的事情。以下是我的阅读方式:
/( # group
^ # start of line
[0-9]+ # one or more digits
\.{0} # *NO* dots
\. # one dot
[0-9]+ # one or more digits
\. # one dot
[0-9] # one digit
$ # end of line
)/x
问题是\.{0}
,这意味着你不想要任何点。
x
标志告诉Ruby使用多行,它忽略空格/空格和注释,从而可以轻松构建记录的模式。
答案 1 :(得分:2)
为什么重新发明轮子?使用像versionomy这样的宝石。您可以解析版本,比较它们,检查相等性,增加特定部分等等。它甚至可以处理alpha,beta,patchlevels等。
require 'versionomy'
number='23.0.23.345'
v = Versionomy.parse number
v.major #=> 23
v.minor #=> 0
v.tiny #=> 23
v.tiny2 #=> 345
答案 2 :(得分:1)
numbers = "23.0.23.345", "23.0.33.173", "0.0.0.0"
pattern = /\d{2}\.0\.\d{2}\.\d{3}/x
numbers.each do |number|
if number.match pattern
puts "#{number} matches"
else
puts "#{number} does not match"
end
end
第一行中的“number”数组需要包含字符串值而不是整数,我还将数组“number”更改为“numbers”,您还需要在numbers数组中使用多个项来调用“.each”。 “循环中的方法。
答案 3 :(得分:1)
似乎就你应该使用的正则表达式达成一致。如果你的最终目标是将字符串的元素提取为整数,那么你可以这样做:
str = "I'm looking for 23.0.345.26, or was that 23.0.26.345?"
str.scan(/(\d{2})\.(0)\.(\d{2})\.(\d{3})/).flatten.map(&:to_i)
#=> [23, 0, 26, 345]