2016-12-08 30 views
-2

出現的字符串使用Ruby的String#scan我想從提取:如何掃描的一個或兩個數字的整數

"8 12 13.5 145 foobar-123F 0.33 10" 

這些結果:

['8', '12', '10'] 

,但沒有別的。

+0

'-12'怎麼辦? – dawg

+0

-12不應該匹配,對不起,應該指定! – whistler

+0

當您嘗試編寫代碼時發生了什麼?你的問題應該詢問它的具體問題,而不是要求我們爲你寫。 「[mcve]」和http://meta.stackoverflow.com/q/261592/128421將是很好的讀取。 –

回答

5

如果你想要一個純粹的基於正則表達式的解決方案:

/(?<=\s|\A)\d{1,2}(?=\s|\Z)/ 

此用途積極lookbehead和積極lookahead檢查數字組是否只包圍分隔符。

但是我會做的是使用String#split來標記字符串,並過濾掉包含非數字字符的標記。在我看來,這將使代碼更具可讀性。例如:

s = "8 12 13.5 145 foobar-123F 0.33 10" 
s.split.select { |token| token =~ /\A\d{1,2}\Z/ } 
=> ["8", "12", "10"] 
+0

這是一個更好的答案。選擇這個... – dawg

+0

謝謝,這太棒了! – whistler

+0

在文本中使用「編輯」,「更新」或「稍後編輯」標籤沒有必要或不可取。相反,只需將信息放在可讀性的位置即可。通過查看修訂歷史記錄,我們可以判斷是否有更改,以及它是什麼。 –

2

您可以使用單詞邊界和lookarounds:

> "8 12 13.5 145 foobar-123F 0.33 10".scan(/(?<!\.)\b\d{1,2}\b(?!\.)/) 
=> ["8", "12", "10"] 

要排除負數:

> "8 12 13.5 145 foobar-123F 0.33 10 -12".scan(/(?<![.\-])\b\d{1,2}\b(?!\.)/) 
=> ["8", "12", "10"]