版本号的Ruby正则表达式

时间:2015-01-08 17:31:26

标签: ruby-on-rails ruby

我想编写一个程序,它以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

输出: 我收到错误: 浮点文字在点之前变为零

4 个答案:

答案 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]