Ruby 如何在字符串中匹配字符串,然后将其提取到变量中

Ruby 如何在字符串中匹配字符串,然后将其提取到变量中,ruby,pattern-matching,Ruby,Pattern Matching,我遇到了一个我看不出能解决的问题。我已将网页中的一行提取到变量中。为了论证起见,我们可以这样说: Ryme=“三只盲鼠版本6.0” 首先,我希望能够在这个字符串(6.0)中找到版本号,然后将这个编号提取到另一个单独的变量中-(我只想提取“6.0”) 我希望我已经澄清了这一点,如果没有,请问我任何你需要知道的,我会尽快回复你 if rhyme =~ /(\d\.\d)/ version = $1 end regexp匹配一个数字,后跟一个句点,后跟另一个数字。括号捕获其内容。因为它是第一

我遇到了一个我看不出能解决的问题。我已将网页中的一行提取到变量中。为了论证起见,我们可以这样说:

Ryme=“三只盲鼠版本6.0”

首先,我希望能够在这个字符串(6.0)中找到版本号,然后将这个编号提取到另一个单独的变量中-(我只想提取“6.0”)

我希望我已经澄清了这一点,如果没有,请问我任何你需要知道的,我会尽快回复你

if rhyme =~ /(\d\.\d)/
    version = $1
end

regexp匹配一个数字,后跟一个句点,后跟另一个数字。括号捕获其内容。因为它是第一对括号,所以它被映射到
$1

首先需要确定版本号的模式。一种可能是
\d+(\.\d+*$
(字符串末尾的数字后跟零或多(点后跟数字))

然后可以使用
String#[]
获取与模式匹配的子字符串:

rhyme[ /\d+(\.\d+)*$/ ] #=> "6.0"

您需要使用正则表达式。我会使用
lyme.scan(/(\d+\.\d+/)
,因为如果发生多个匹配,它可以返回一个数组。它还可以采取一个块,以便您可以添加范围检查或其他检查,以确保捕获正确的一个

version = "0.0"
rhyme = "three blind mice Version 6.0"
rhyme.scan(/(\d+\.\d+)/){|x| version = x[0] if x[0].to_f < 99}
p version
version=“0.0”
Ryme=“三只盲鼠版本6.0”
marym.scan(/(\d+\.\d+/){x | version=x[0]如果x[0]。to_f<99}
p版本
如果可以信任输入只产生一个匹配项,或者如果您总是要使用第一个匹配项,那么您可以使用本例中的解决方案


编辑:因此,在我们讨论之后,请继续。

您的正则表达式忽略了6。它应该是/(\d+\.\d+/@Gerhard:Nope。我的正则表达式按原样工作。如果您在irb中运行我的代码,您将看到它确实像我说的那样返回“6.0”。与您建议的正则表达式不同,我的正则表达式也将匹配“6”或“6.0.0”。@Gerhard:要使其与
扫描
一起工作,您需要使组不捕获(当然还需要移除锚定)。这样:
“1.0 2.0.0 3”。scan(/\d+(?:\.\d+*/)\35;=>[“1.0”、“2.0.0”、“3”]
@Gerhard:也就是说,我特别锚定了regex,因为我假设OP不希望名称中出现的杂散数字影响结果,所以我不建议使用scan。也就是说,我认为对于“Sepp2k的base 2到base 16转换器版本42”,它应该只返回42,而忽略2和16。@Sepp2k:我在irb和rubular中检查了它,它工作了。但括号的目的是什么。
/\d+\.\d+/
不够吗?您想如何找到版本号?它总是唯一的号码吗?它总是在“版本”之后吗?总是在结尾吗?版本号的可能格式是什么?是否总是有小数点?可以有多少个数字或数字组?