【问题标题】:How to convert a comma-delimited string into an array如何将逗号分隔的字符串转换为数组
【发布时间】:2020-05-21 11:29:31
【问题描述】:

我正在尝试用一个字符串创建一个数组,然后去掉字符串周围的引号。

这是我尝试过的:

hg = "'Erra', 'Erra-Network', 'Discovery'".split(",")
hg2 = hg.each { |n| n.delete_prefix("'").delete_suffix("'") }
print(hg2)

但不起作用。

输出:

["'Erra'", " 'Erra-Network'", " 'Discovery'"]

【问题讨论】:

  • 预期输出是什么?
  • 不带单引号的数组
  • each改成map再试一次
  • "'Erra', 'Erra-Network', 'Discovery'" - 字符串从何而来?
  • @Mefistofeles :您在块内计算一个新字符串,然后将其丢弃。您永远不会真正修改数组元素之一。在文档中查找 delete_prefixdelete_prefix! 之间的区别。

标签: arrays ruby string


【解决方案1】:

你太难了。我会这样做:

hg = "'Erra', 'Erra-Network', 'Discovery'"

hg.delete(" '").split(',') # => ["Erra", "Erra-Network", "Discovery"]

delete 正在进行清理,应该在尝试split 字符串之前完成。

delete_prefixdelete_suffix 是有用的方法,但在处理您正在解析的字符串时却不是,因为它们会迫使您迭代地处理子字符串。 delete 一步完成整个字符串,速度更快。

如果我要迭代,我会这样做:

hg.split(/, */).map { |s| s[1..-2] } # => ["Erra", "Erra-Network", "Discovery"]

利用split 能够采用正则表达式自动在逗号后跟任意数量的空格处中断。 基本上,您将尝试解析损坏的 CSV 记录,因此您应该使用 CSV 类。该文档有许多examples for parsing 记录:

require 'csv'
CSV.parse(hg.delete("' ")).flatten # => ["Erra", "Erra-Network", "Discovery"]

CSV 有许多选项可用于处理分隔符和引用字符串的奇怪变化,因此如果您想这样做,请研究文档。

【讨论】:

    【解决方案2】:

    您可以使用 CSV 来获取结果:

    require 'csv'
    
    string = "'Erra', 'Erra-Network', 'Discovery'"
    result = CSV.parse_line(string, col_sep: ', ', quote_char: "'")
    #=> ["Erra", "Erra-Network", "Discovery"]
    

    请注意,以上假设分隔符为', '。这意味着逗号后面必须始终跟一个空格。

    【讨论】:

      【解决方案3】:

      您正在处理hg,但随后打印hg2 以检查操作是否成功。虽然这不是问题,但可能会导致混乱。

      此外,当您在其非破坏性版本中使用 delete_prefixdelete_suffix 时,应用的更改会返回一个新对象,该对象不会在任何地方“持久化”。

      如果您想查看产生的更改,可以使用它们的破坏性版本delete_prefix!delete_suffix!

      hg2 = hg.each do |n|
        n.delete_prefix!("'")
        n.delete_suffix!("'")
      end
      
      hg # ["Erra", " 'Erra-Network", " 'Discovery"]
      

      或者更确切地说,使用 map 并将每个操作的结果生成一个新对象:

      hg2 = hg.map { |n| n.delete_prefix("'").delete_suffix("'") }
      
      p hg2 # ["Erra", " 'Erra-Network", " 'Discovery"]
      

      虽然这会导致["Erra", " 'Erra-Network", " 'Discovery"] 并且不符合问题的标题“删除字符串周围的引号”

      【讨论】:

      • 啊,我完全明白了。
      • 根据最后一条评论,标题有点误导,因为它与代码中显示的内容不对应。使用 delete_prefix 和/或 delete_suffix 的事实并不意味着您要删除字符串周围的引号。
      【解决方案4】:

      尝试map 而不是each,它将返回一个新的更新数组:

      hg = "'Erra', 'Erra-Network', 'Discovery'".split(",")
      hg2 = hg.map { |n| n.delete_prefix("'").delete_suffix("'") }
      print(hg2)
      

      each 将为数组中的每个元素执行,但随后将返回原始未修改的数组。 map实际上返回了修改后的Array:https://stackoverflow.com/a/5254192/44733

      【讨论】:

      • 分隔符中需要一个空格才能使此解决方案工作split(", ")
      猜你喜欢
      • 2011-06-18
      • 2019-05-19
      • 1970-01-01
      • 2021-12-18
      • 1970-01-01
      • 2021-12-06
      相关资源
      最近更新 更多