【问题标题】:Issue with multiple wildcard symbols when iterating in array with `.gsub!`使用“.gsub!”在数组中迭代时出现多个通配符问题
【发布时间】:2015-01-20 20:58:23
【问题描述】:

我试图弄清楚如何使用多个通配符替换字符串数组中的多个字符(如果有人知道的话,也可以使用其他方法。)数组中的每个元素都是电话号码和日期,(例如 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! 将是正确的方法,但我也愿意接受任何替代方法。任何帮助表示赞赏。

【问题讨论】:

    标签: ruby arrays regex gsub string-substitution


    【解决方案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
    

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

    【讨论】:

    • s[0..6]map {|s| s[0,7] }
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      使用String#partition

      name.partition(',')[0]
      
      =>"8675309"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-13
        • 2023-03-21
        相关资源
        最近更新 更多