获取正则表达式的版本号

时间:2014-06-10 15:18:13

标签: ruby regex

我有一个字符串:

"MyProgramm build version 0.0.7.161"

我想从中获取版本。我试过了:

String(build_num[/MyProgramm build version (\d*.\d*.\d*.\d*)$/, 1])

我得到了:

", 0.0.7.161"

为什么我在前面得到逗号?

2 个答案:

答案 0 :(得分:6)

你可以做一些简单的事情:

str = "MyProgramm build version 0.0.7.161"
str.scan(/\d+/).join('.') # => "0.0.7.161"

如果您知道字符串中的唯一数字在版本子字符串中,那很好。但是,如果应用程序的名称中包含数字,会发生什么?

str = "HTML2PDF build version 0.0.7.161"
str.scan(/\d+/).join('.') # => "2.0.0.7.161"

或更糟:

str = "foobar_v1.0 build version 1.0.7.161"
str.scan(/\d+/).join('.') # => "1.0.1.0.7.161"

显然,这不是你想要的,因此,在这一点上,代码必须变得更聪明。如果版本子字符串总是在字符串的末尾,那么这样的东西将起作用:

str = "HTML2PDF build version 0.0.7.161"
str.split.last.scan(/\d+/).join('.') # => "0.0.7.161"

但是,既然你有子串,你打算用它做什么?比较什么?您无法比较这种字符串,以了解一个版本小于另一个版本:

"0.0.7.161" < "0.0.7.2" # => true

比较字符与比较整数是一样的,因此需要更多智能,或者至少要确保字符串按所需顺序排序/比较:

str.split.last.scan(/\d+/).map{ |s| '%03d' % s.to_i }.join('.') # => "000.000.007.161"
"000.000.007.161" < "000.000.007.002" # => false

或相反:

"000.000.007.002" < "000.000.007.161" # => true

版本号比较是一个问题,您可以找到人们尝试处理它的各种方法。有几次我需要这样做,我重新使用Ruby的Gem::Version类中的代码,这有帮助。尽管如此,你时不时会遇到奇怪的现象,并且必须弄清楚哪种方法适合你的情况。

答案 1 :(得分:0)

我能够使用扫描方法这样做:

[20] pry(main)> string
=> "MyProgramm build version 0.0.7.161"
[21] pry(main)> string.scan(/\d\.*/).join
=> "0.0.7.161"

所以试试

state.scan(/\d\.*/).join