2015-01-20 70 views
0

我想弄清楚如何使用多個通配符(或其他方法,如果有人知道更好)來替換字符串數組中的多個字符。數組中的元素是電話號碼和日期,(例如8675309,2015-01-20)。我試圖只刪除逗號和日期,以便數組中的每個元素只能是電話號碼使用`.gsub!'在數組中迭代時出現多個通配符符號

當迭代數組中的每個元素時,我通過在每個元素替換單個字符時調用.gsub!來獲得預期結果。

file_data = ["8675309,2015-01-20"] 
puts file_data[0] #=> 8675309,2015-01-20 
file_data.each do |s| 
    s.gsub!(/0/, "X") 
end 
puts file_data[0] #> 86753X9,2X15-X1-2X 

爲了消除逗號和日期,我試着簡單地使用通配符,調用s.gsub!(",****/**/**", "")。然後,這表明意外的結果:(「 」和「^」)

file_data = ["8675309,2015-01-20"] 
file_data.each do |s| 
    s.gsub!(/,****-**-**/, "") 
end 
puts file_data[0] #> 8675309,2015-01-20 

我也嘗試已表明在其他線程其他幾個通配符,但結果並沒有改變。

我迷失在如何消除每個元素中的逗號和日期,同時保持主號碼完好無損。我認爲.gsub!將是正確的方法,但我也願意接受任何替代方案。任何幫助表示讚賞。

回答

1

乍一看,我可能會使用String#split來獲取電話號碼:

file_data = ["8675309,2015-01-20"] 
phone_numbers = file_data.map {|s| s.split(',').first } 
phone_numbers[0] #=> "8675309" 

或者,如果電話號碼始終是7個字符,我可能會得到一個字符串子集[]

file_data.map {|s| s[0,7] } 

或者,如果你真的想堅持使用正則表達式:

file_data.each do |s| 
    s.gsub!(/,.*\z/, '') 
end 

其中的內容如下:從第一個逗號開始到字符串末尾的字符串的一部分,替換爲無。

+1

'S [0..6]'比'地圖{更快| S | s [0,7]}' – Grych 2015-01-20 21:16:52

1

您處理通配符的方式過多。當你知道你想要分享什麼時,你爲什麼使用通配符?刪除逗號和日期(只要日期始終是相同的格式)應該很簡單:

name = "8675309,2015-01-20" 
name.gsub!(/,\d{4}-\d{2}-\d{2}/,"") 
0

String#partition使用

name.partition(',')[0] 

=>"8675309"