2016-12-30 67 views
1

我有一個數組:如何通過RegExp從數組中提取整數值(混合類型:整數/字符串)?

arr2 = [6, '(7,0)', '(15,0)', '(5,0)', 3, '(15,2)', 17] 

欲解析數組的每個元素,並獲得值如下:

arr2 = [6, 0, 0, 0, 3, 2, 17] 

意味着如果數組元素是像(15,2)然後只有第二個元素(即2)應該被打印在響應中,並且如果數組元素不是像(7,0)那樣的格式,那麼它應該按原樣打印。

+1

'arr2'是用Ruby無效的結構。 –

+0

@ sagarpandya82,可以隱蔽這個數組轉換爲字符串類型,如下所示: ARR2 =%(重量)[6,(7,0),(15,0),(5,0),3,(15,2) ,] –

+1

你已經被告知17已經是'[6,(7,0),(15,0),(5,0),3,(15,2),17]'是不是有效的Ruby對象你又來了。 Downvoted並投票結束。 – mudasobwa

回答

3
[6, [7,0], [15,0], [5,0], 3, [15,2], 17].map { |e| [*e].last } 
#⇒ [6, 0, 0, 0, 3, 2, 17] 

如果元素是字符串:

%w[6, (7,0), (15,0), (5,0), 3, (15,2), 17].map { |e| e[/\d+(?=\)|,?\z)/] } 
#⇒ ["6", "0", "0", "0", "3", "2", "17"] 

map(&:to_i)後者以獲得整數數組。


最後,對於先進的最新版本:

[6, '(7,0)', '(15,0)', '(5,0)', 3, '(15,2)', 17]. 
    map { |e| e.to_s[/\d+(?=\)|,?\z)/] }. 
    map(&:to_i) 
#⇒ [6, 0, 0, 0, 3, 2, 17] 

異國短毛貓:

[6, '(7,0)', '(15,0)', '(5,0)', 3, '(15,2)', 17]. 
    inspect. 
    scan(/\d+(?:,\d+)?/). 
    map { |e| e.split(',').last.to_i } 
#⇒ [6, 0, 0, 0, 3, 2, 17] 
+0

'%w'語法不需要逗號,只寫'%W [6(7,0)...' – akuhn

+0

@akuhn「'%w'語法不需要逗號」 - 良好的知道,謝謝。 – mudasobwa

3
arr = [6, '(7,0)', '(15,0)', '(5,0)', 3, '(15,2)', 17] 

arr.map do |obj| 
    case obj 
    when Integer 
    obj 
    else 
    obj[/(?<=,)\d+/].to_i 
    end 
end 
    #=> [6, 0, 0, 0, 3, 2, 17] 
3

這似乎沒什麼問題:

arr2.map{|x| x.to_s.scan(/\d+/).last.to_i } 

如果你想要的東西沒有正則表達式:

arr2.map do |item| 
    item.is_a?(Integer) ? item : item[1+item.rindex(',')..-2].to_i 
end