获取正则表达式的版本号

Bil*_*riy 2 ruby regex

我有一个字符串:

"MyProgramm build version 0.0.7.161"
Run Code Online (Sandbox Code Playgroud)

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

String(build_num[/MyProgramm build version (\d*.\d*.\d*.\d*)$/, 1])
Run Code Online (Sandbox Code Playgroud)

我得到:

", 0.0.7.161"
Run Code Online (Sandbox Code Playgroud)

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

the*_*Man 6

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

str = "MyProgramm build version 0.0.7.161"
str.scan(/\d+/).join('.') # => "0.0.7.161"
Run Code Online (Sandbox Code Playgroud)

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

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

或者更糟:

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

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

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

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

"0.0.7.161" < "0.0.7.2" # => true
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

或者相反:

"000.000.007.002" < "000.000.007.161" # => true
Run Code Online (Sandbox Code Playgroud)

版本号比较是一个问题,你会发现人们试图在那里处理它的各种方式.有几次我需要这样做,我重新使用Ruby的Gem :: Version类中的代码,这有助于.尽管如此,你时不时会遇到奇怪的现象,并且必须找出适合你情况的方法.