我有一个字符串:
"MyProgramm build version 0.0.7.161"
我想从中获取版本。我试过了:
String(build_num[/MyProgramm build version (\d*.\d*.\d*.\d*)$/, 1])
我得到了:
", 0.0.7.161"
为什么我在前面得到逗号?
答案 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