从正则表达式中提取Ruby版本

时间:2014-08-22 21:14:04

标签: ruby regex

我试图从正则表达式返回Ruby的版本(例如2.1.0)。这是字符串,因为它应该由正则表达式计算:

ruby 2.1.0p0 (2013-12-25 revision 44422) [x86_64-darwin12.0]\n

我如何从中提取2.1.0?在我看来,最好的方法是提取两个周期的数字,但周围没有空格或字符。所以基本上,它只会拉2.1.0而不是其他任何东西。

有什么想法吗?

4 个答案:

答案 0 :(得分:4)

怎么样:

str = "ruby 2.1.0p0 (2013-12-25 revision 44422) [x86_64-darwin12.0]\n"
str[/[\d.]+/] # => "2.1.0"

[\d.]+表示“查找数字字符串或'.'

str[/[\d.]+/]将找到第一个匹配并返回它的字符串。有关详细信息,请参阅String#[]

问题是,所有版本和Ruby解释器是否一致地返回其版本信息?如果你的代码最终会在Ruby之外的某些东西上运行,那么如果-v输出以一种将版本更深入到字符串中并且其他东西首先匹配的方式发生变化,则可能会出现问题。

  

TinMan,我认为你需要一个更严格的正则表达式;例如,“1..0”[/ [\ d。] + /] => “1..0”,“2.0.0.1。”[/ [\ d。] + /] => “2.0.0.1。”,“2.0.0.0.1”[/ [\ d。] + /] => “2.0.0.0.1”

Ruby uses a similar style to Semantic Versioning,因此字符串的实际格式不应有所不同,从而允许使用简单的模式。 其中版本号可能无法定义。

如果它变得疯狂,像/[\d.]{3,5}/这样的东西应该把东西放回到某种类似的顺序中,并规范化返回的值:

[
  'foo 1.0 bar',
  'foo 1.1.1 bar',
  'foo 1.1.1.1 bar'
].map{ |s| s[/[\d.]{3,5}/] }
# => ["1.0", "1.1.1", "1.1.1"]

如果您尝试使用运行代码执行此操作,为什么不使用预定义常量RUBY_VERSION

RUBY_VERSION # => "2.1.2"

众所周知,版本号难以获取,因为人们使用这么多种方式来格式化它们。在过去的几年里,我们已经看到了一些创造一些秩序和共性的尝试。

答案 1 :(得分:1)

编辑:我误解了这个问题。我假设给定的字符串可能嵌入在其他文本中,但在重新阅读时我发现事实并非如此。 @theTinMan给出的正则表达式足够且首选。 tidE

这是一种方式:

str = "ruby 2.1.0p0 (2013-12-25 revision 44422) [x86_64-darwin12.0]\n"

str[/[Rr]uby\s+(\d\.\d\.\d)/,1]
 #=> "2.1.0"

这可以写成:

str[/[Rr]uby\s+(\d(\.\d){2})/,1]

如果需要匹配“Ruby 2.1”或Ruby“2”,可以使用

str[/[Rr]uby\s+(\d(\.\d){,2})/,1] # match "2", "2.1" or "2.1.1"

str[/[Rr]uby\s+(\d(\.\d){1,2})/,1] # "2.1" or "2.1.1", but not "2"

答案 2 :(得分:1)

只需检查RUBY_VERSION

不要解析你想要解析的任何内容的输出,而只需检查RUBY_VERSION常量。在任何最近的Ruby上,您应该在REPL中获得类似于以下内容的输出,如irb或pry:

RUBY_VERSION
# => "2.1.0"

或者在命令行上询问Ruby:

$ ruby -e 'puts RUBY_VERSION'
2.1.0

答案 3 :(得分:0)

试试这个:

str = "ruby 2.1.0p0 (2013-12-25 revision 44422) [x86_64-darwin12.0]\n"

pieces = str.split(" ", 3)
version, patch_num = pieces[1].split('p')

puts version

--output:--
2.1.0