2013-12-19 31 views
1

我有一個字符串&一個數組,我試圖遍歷數組以查看其任何元素是否匹配字符串的一部分。將字符串的部分匹配到Ruby中數組的元素

string = "HOPJYJKCONNECTICUTQZIDAHOKR" 

states_array = ["TEXAS", "ALASKA", "IDAHO", "FLORIDA", "MONTANA", "OHIO", "NEWMEXICO", "CONNECTICUT", "COLORADO"] 

如何迭代states_array以便我可以找到字符串中的所有匹配項?我想輸出所有匹配的狀態爲一個數組&所以最終的結果可能是這樣的:由Matt

#=> ["CONNECTICUT", "IDAHO"] 
+1

應該是'「得克薩斯」,「阿拉斯加」,''沒有「得克薩斯」,「阿拉斯加」' – steenslag

+0

有一個在您的評論中有語法錯誤......當真? – Cilan

+0

@PeterAlfvin我在提問'#=> [「CONNECTICUT」,「IDAHO」]。 – Cilan

回答

5
string = "HOPJYJKCONNECTICUTQZIDAHOKR" 
states = ["TEXAS", "ALASKA", "IDAHO", "FLORIDA", "MONTANA", "OHIO", "NEWMEXICO", "CONNECTICUT", "COLORADO"] 

states.select { |s| string[s] } 
# => ["IDAHO", "CONNECTICUT"] 
+0

優秀。謝謝。新來這&並不確定是否必須迭代數組中的每個元素之前匹配到字符串。非常感激! – BandanaKM

2

很好的解決方案,但既然你指定也可以做

states.select { |s| string.match(s)} 
+3

或'states.select {| s | string.include?但它基本上是一樣的。 – toniedzwiedz

1

在這個問題上的正則表達式標記,你可以用正則表達式如下:

string.scan(Regexp.new(states.join('|'))) 
# => ["CONNECTICUT", "IDAHO"] 

使用馬特的答案中的變量。不過,不建議這樣做。 :-)

+0

好點:(1)OP確實指定了正則表達式。 (2)這給出了與OP相同順序的答案。 +1 – Matt

+0

謝謝,但不確定您的意思是「與OP相同的訂單」。事實上,在回顧這個問題時,OP詢問了「迭代狀態」,這是不行的。 ;-) –

+0

這意味着答案'[「CONNECTICUT」,「IDAHO」]的排序方式與OP中的相同,與'string'中的相同。 – Matt

0

這就像@ Peter_Alvin的回答,使用內置方法union

states_array = ["TEXAS", "ALASKA", "IDAHO", "FLORIDA", "MONTANA", "OHIO", "NEWMEXICO", "CONNECTICUT", "COLORADO"] 
str = "HOPJYJKCONNECTICUTQZIDAHOKR" 
p str.scan(Regexp.union(states_array)) # ["CONNECTICUT", "IDAHO"]