Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从正则表达式中提取Ruby版本_Ruby_Regex - Fatal编程技术网

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

从正则表达式中提取Ruby版本,ruby,regex,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,而不是其他任何东西 有什么想法吗?怎么样: str = "ruby 2.1.0p0 (2013-12-25 revision 44422) [x8

我试图从正则表达式返回Ruby的版本(如2.1.0)。以下是应该由正则表达式计算的字符串:

ruby 2.1.0p0 (2013-12-25 revision 44422) [x86_64-darwin12.0]\n
如何从中提取
2.1.0
?在我看来,最好的方法是提取两个句点周围的数字,但不要在它们周围加空格或字符。因此,基本上,它将只拉
2.1.0
,而不是其他任何东西

有什么想法吗?

怎么样:

str = "ruby 2.1.0p0 (2013-12-25 revision 44422) [x86_64-darwin12.0]\n"
str[/[\d.]+/] # => "2.1.0"
[\d.]+
表示“查找一个数字字符串或
”。

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

问题是,所有版本和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”

,因此字符串的实际格式不应改变,允许使用简单的模式。但是,可能没有定义版本号出现的位置

如果它变得疯狂,像
/[\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\u版本

RUBY_VERSION # => "2.1.2"

众所周知,版本号很难获取,因为人们使用了很多不同的方式来格式化版本号。在过去的几年中,我们看到了一些试图创造某种秩序和共性的尝试。

编辑:我误读了这个问题。我假设给定的字符串可能嵌入到其他文本中,但在重新阅读时我看情况显然不是这样。@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"

只需检查RUBY_版本 与其解析您试图解析的内容的输出,不如检查RUBY_VERSION常量。在任何最近的RUBY上,您应该在类似irb或pry的REPL中获得类似于以下内容的输出:

RUBY_VERSION
# => "2.1.0"
或者在命令行上使用以下命令询问Ruby:

$ ruby -e 'puts RUBY_VERSION'
2.1.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

尝试
/^(.*?)\(/
这将在(@SamD,OP不想要
“p0”
ruby--version是获取此信息的非常糟糕的方法。例如,Rubinius将报告
Rubinius 2.2.10(2.1.0 bf61ae2e 2014-06-27 JI)[x86_64-darwin13.3.0]
.RUBY\u版本是跨多个RUBY解释器的更合理的方法。在每行之前添加4个空格。@dCasimir,我发现我误读了关于最后一个
后面位的问题添加4个空格?我不这么认为。添加4个空格只是在Stackoverflow中设置代码格式的一种方法!而不是使用“`”。使用手机更容易。TinMan,我认为您需要一个更严格的正则表达式;例如,
“1..0”[/[\d.]+/][d.]=>“1..0”
“2.0.0.1.”,
“2.0.0.0.0.1”[/d.+/][/d>“2.0.0.1”
。好吧,是的,如果Ruby使用了这样的编号方案。对于语义版本编号,因此格式不应该像您所展示的那样疯狂。重读这个问题时,我看到OP强加了严格的格式假设。我在想“11 Ruby 2.1.1…”之类的情况,您的正则表达式将返回“11”.我看这不是问题。
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