2015-01-20 64 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"