0

我试图弄清楚如何通过使用多个通配符(或者如果有人知道更好的其他方法)来替换字符串数组中的多个字符。数组中的每个元素都是电话号码和日期,(例如 8675309,2015- 01-20)。我试图仅删除逗号和日期,以便数组中的每个元素仅是电话号码

当迭代数组中的每个元素时,我通过在.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!这是正确的方法,但也对任何替代方法持开放态度。任何帮助表示赞赏。

4

3 回答 3

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

其内容为:从第一个逗号开始到字符串末尾的字符串的一部分,替换为空。

于 2015-01-20T21:15:22.460 回答
1

您处理通配符的方式太过分了。当您知道要分取什么时,为什么还要使用通配符?删除逗号和日期(只要日期始终是相同的格式)应该很简单:

name = "8675309,2015-01-20"
name.gsub!(/,\d{4}-\d{2}-\d{2}/,"")
于 2015-01-20T21:13:54.990 回答
0

利用String#partition

name.partition(',')[0]

=>"8675309"
于 2015-01-21T14:54:35.587 回答