2017-02-22 51 views
-1

我正在使用Rails 5.我遇到了編寫正則表達式的問題。我想寫一個表達式來解析一個字符串,尋找一個正數,然後查找數字後面的第一個單詞,無論數字和下一個單詞之間是否有空格或其他類型的單詞邊界。所以我試過我如何編寫一個正則表達式來捕獲一個數字後的單詞?

2.4.0 :006 > str = "2g" 
=> "2g" 
2.4.0 :007 > str.match(/\W?(([0-9]+(\.[0-9]+)?)\W*(^[0-9:\/]+))/) 
=> nil 

但是正如你所看到的沒有匹配發生。我希望這場比賽能夠抓住「2」,然後是「g」。同樣,如果我有像

2.4.0 :008 > str = "12.2 word next" 
=> "12.2 word next" 
2.4.0 :009 > str.match(/\W?(([0-9]+(\.[0-9]+)?)\W*(^[0-9:\/]+))/) 
=> nil 

我期望正則表達式捕獲「12.2」,然後下一個單詞「單詞」。但正如你所看到的,我的正則表達式並沒有削減它。我如何解決它以捕捉我需要的東西?

+0

試圖選擇「12.2 word next」中的「12.2word」或「12.2 word」? – MohaMad

+0

我想有一些選擇數組 - 第一個元素是數字,「12.2」和第二個元素是單詞「單詞」(即[「12.2」,「單詞」)) – Dave

+0

你可以找到它在我編輯的答案@Dave – MohaMad

回答

0

您是否在「12.2 word next」中選擇「12.2word」或「12.2 word」?

正如你在評論說,有浮點數到第1組和字組2:

(\d+\.\d+|\d+)[^a-zA-Z0-9]*([a-zA-Z]+) 
Full match 6-15 `12.2 good` 
Group 1. 6-10 `12.2` 
Group 2. 11-15 `good` 


我的第一個答案是:

(\d+(\.\d{0,})?)[^a-zA-Z0-9]*([a-zA-Z]+) 
for " 12.2 good " 
Full match 6-15 `12.2 good` 
Group 1. 6-10 `12.2` 
Group 2. 8-10 `.2` 
Group 3. 11-15 `good` 

組別1是你的整數部分和第2組是在本例中爲null或者等於2。

0

這應該工作。

([0-9.]+)\s(\w+) 

輸入:

12.2 word 

輸出:

12.2 
word 

的Ruby代碼:

re = /([0-9.]+)\s(\w+)/ 
str = '12.2 word' 

# Print the match result 
str.scan(re) do |match| 
    puts match.to_s 
end 

參見:https://regex101.com/r/ncVEAT/1

+0

雖然這適用於「12.2字」它不適用於「12.2字下一個」或「12.2字下一個」,我都想要有「12.2」作爲第一個匹配eleemnt和「word」作爲第二個匹配元素。 – Dave

+0

使用'[^ ​​a-zA-Z0-9]'而不是'\ s' @Dave – MohaMad

+0

這個正則表達式匹配'1.2.27字''1.2.27'是你接受的匹配嗎? – MohaMad

相關問題