2010-09-20 71 views
2

我遇到了一個我無法解決的問題。我已經從網頁中提取了一行到一個變量。讓說的論據的緣故,這是:如何模式匹配字符串中的字符串,然後將其提取到變量中

韻=「三隻瞎老鼠6.0版」

,我希望能夠首先找到該字符串(6.0),其次內部版本號提取此數到另一個單獨的變量 - (我想具體提取不超過「6.0」)

我希望我澄清了這一點,如果沒有請問我任何你需要知道,我會盡快回復你。

+1

你想如何找到版本號?它總是唯一的數字嗎?它是否總是在「版本」之後?它總是在最後?版本號的可能格式是什麼 - 是否總是有小數點?可以有多少個數字或一組數字? – 2010-09-20 10:55:25

回答

5

首先,您需要確定版本號的模式應該是什麼樣的。一種可能性是\d+(\.\d+)*$(在字符串的末尾有一個數字後跟零個或多個(點後跟一個數字))。

然後你可以使用String#[]得到匹配模式的子字符串:您需要使用正則表達式

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

你的正則表達式錯過了6.它應該是/(\d+\.\d+)/。 – Gerhard 2010-09-20 10:44:10

+0

@Gerhard:不。我的正則表達式按原樣運行。如果你用irb運行我的代碼,你會發現它確實像我說的那樣返回「6.0」。也不像你提出的正則表達式,我的也會匹配「6」或「6.0.0」。 – sepp2k 2010-09-20 10:48:18

+0

@Gerhard:爲了使它與'scan'一起工作,你需要使組不捕獲(並且當然移除錨)。像這樣:'「1.0 2.0.0 3」.scan(/ \ d +(?:\。\ d +)* /)#=> [「1.0」,「2.0.0」,「3」]' – sepp2k 2010-09-20 10:52:43

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

正則表達式匹配一個數字,後跟一個句點,後跟另一個數字。圓括號捕捉其內容。由於它是第一對括號,因此它被映射到$1

+0

看起來像Perl。 – 2010-09-20 10:58:08

2

。我會使用rhyme.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 

如果輸入的是可以信任的產生只有一個匹配,或者如果你總是要使用的第一場比賽,你可以只使用本answer的解決方案。

編輯:所以在我們的討論後,只要去那answer

相關問題