Ruby 提取正则表达式中的字符串

Ruby 提取正则表达式中的字符串,ruby,regex,string,Ruby,Regex,String,我对Ruby有点陌生,但我对Ruby中的正则表达式有一个问题 我有一个字符串,我想将字符串中的数字保存在一个新变量中,只保存数字。 红宝石是一种粉红色到血红色的宝石,是一种刚玉(氧化铝)矿物的变种。 我的文本列表 ruby is a pink to blood-red colored gemstone, a variety8of the mineral corundum (aluminium oxide). 我的正则表达式是: /blood-red colored gemstone, a v

我对Ruby有点陌生,但我对Ruby中的正则表达式有一个问题

我有一个字符串,我想将字符串中的数字保存在一个新变量中,只保存数字。 红宝石是一种粉红色到血红色的宝石,是一种刚玉(氧化铝)矿物的变种。 我的文本列表

ruby is a pink to blood-red colored gemstone, a variety8of the mineral corundum (aluminium oxide). 
我的正则表达式是:

/blood-red colored gemstone, a variety(.*?)of the mineral corundum/m
现在我想将结果保存在一个新变量中。让我们说:

var1 = 'ruby is a pink to blood-red colored gemstone, a variety8of the mineral corundum (aluminium oxide).'

现在结果是血红的整句话。。。到矿物刚玉。 但是我怎样才能在没有边界的情况下进入中东呢。在Rubular中,它显示为一个“组”(在我的例子中,我希望访问句子中的数字)。我如何才能访问此组

你可以看我在Rubular的例子

非常感谢

来自:

如果提供了Regexp,则字符串的匹配部分为 返回如果捕获遵循正则表达式,则可能是 捕获组索引或名称,遵循 将返回MatchData的组件。

因此,这应该是可行的:

 var2 = var1[/blood-red colored gemstone, a variety(.*?)of the mineral corundum/m, 1]
 # => "8"

在Ruby中,每个组都存储在一个匹配项中。如果显式使用,将返回一个,您可以访问匹配项

s = "ruby is a pink to blood-red colored gemstone, a variety8of the mineral corundum (aluminium oxide)."
r = /blood-red colored gemstone, a variety(.*?)of the mineral corundum/m

m = s.match(r)
m[1]
 => "8" 

有几个快捷方式,或多或少可读。例如,您可以使用
String#slice

s.slice(r, 1)
 => "8" 
还是全局变量

if s =~ m
  # $1 is the first match
  $1
end

如果您100%确定输入匹配,则
slice
是一个不错的选择。如果您需要执行某种测试,那么您可能需要检查是否出现匹配。

OMG。完美的这个社区非常快。谢谢你。我假设一的意思是,它应该从里面的“result”字符串中取第一个字符,对吗?不,如果你想要一个数字,你会想解析它:
var2.to_i
接收
8
是。我知道以后我必须把它转换成整数。但是如果我测试它,里面有更多的数字,正则表达式中的1给了我整个字符串。是的,如果你想要
…variety18of…
的结果是
1
,你可以选择第一个字符,或者将表达式改为
。。。各种各样的(.?)。
s.slice(r, 1)
 => "8" 
if s =~ m
  # $1 is the first match
  $1
end