使用“.gsub!”在数组中迭代时出现多个通配符问题

Issue with multiple wildcard symbols when iterating in array with `.gsub!`

我想弄清楚如何使用多个通配符(或者其他一些方法,如果有人知道的话)来替换字符串数组中的多个字符。数组中的每个元素都是一个电话号码和日期,(例如. 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! 是正确的方法,但我也对任何替代方法持开放态度。感谢任何帮助。

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

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

乍一看,我可能会用String#split得到phone号:

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

或者,如果 phone 数字始终为 7 个字符,我可能会得到一个字符串子集 []:

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

或者,如果您真的想坚持使用正则表达式:

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

读作:从第一个逗号到字符串末尾的字符串的一部分,不替换任何内容。

使用String#partition

name.partition(',')[0]

=>"8675309"