【问题标题】:Ruby - Converting a mixed string into an arrayRuby - 将混合字符串转换为数组
【发布时间】:2016-09-06 04:40:53
【问题描述】:

我正在解决一个问题,我收到了一个字符串形式的“编码”消息,并且必须返回解码后的消息。这需要我将一串混合字符和数字拆分成一个数组。例如,如果我得到一个这样的字符串:

"0h"

我想把它拆分成这样的数组:

[0, "h"]

但是当我使用.split 时,我得到了

["0", "h"]

我发现的解决方案只考虑全为数字的字符串,而不是混合字符串。有没有办法在保留字符的同时将数字字符串转换为数字?

【问题讨论】:

    标签: arrays ruby string


    【解决方案1】:

    您可以将String#scan 与正则表达式一起使用。

    str = "0hh1ghi22d"
    
    str.scan(/\d+|\D+/).map { |s| s =~ /\d+/ ? s.to_i : s }
      #=> [0, "hh", 1, "ghi", 22, "d"]
    

    str.each_char.map { |s| s =~ /\d/ ? s.to_i : s }
      #=> [0, "h", "h", 1, "g", "h", "i", 2, 2, "d"]
    

    取决于要求。

    【讨论】:

    • chars 如果需要单个字符,第一部分也可以使用。
    • @tadman,很好的建议,因为这个问题还不清楚。我做了修改。
    • 您可以通过使用捕获组避免匹配\d+ 两次:str.scan(/(\D+)|(\d+)/).map { |s, d| s || d.to_i }(注意我已经更改了\D+\d+ 的顺序)
    • @Stefan,这很好,但我不明白你为什么需要更改\d+\D+ 的顺序。读者,如果你不遵循 Stefan 的代码,请注意 str.scan(/(\D+)|(\d+)/) #=> [[nil, "0"], ["hh", nil], [nil, "1"], ["ghi", nil], [nil, "22"], ["d", nil]]
    • 谢谢!这很好用。就这样我知道我理解发生了什么,因为我真的是地图新手,它将每个字符传递给一个块,查看字符是否为数字,如果是,则将其转换为整数。这是 /\d/ 做的吗?只是想确保我理解它的逻辑。非常感谢您的帮助!
    【解决方案2】:

    如果我理解正确,您希望字符串中的数字最终作为数组中的 Fixnums。

    您可以通过将.map 添加到您的split 来做到这一点:

    ... .map { |c| c =~ /\d/ ? c.to_i : c }
    

    【讨论】:

      猜你喜欢
      • 2014-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-08
      • 2012-05-18
      • 1970-01-01
      • 2011-12-15
      • 2010-09-06
      相关资源
      最近更新 更多