【问题标题】:How to split a string of repeated characters with uneven amounts? Ruby如何拆分数量不均的一串重复字符?红宝石
【发布时间】:2016-02-03 20:08:56
【问题描述】:

如果我有一个字符串,例如"aabbbbccdddeffffgg",并且我想将字符串拆分为这个数组:["aa", "bbbb", "cc", "ddd", "e", "ffff", "gg"],我该怎么做?

我知道string.split/.../

  `letter_count_1 = {}
    str1.each_char do |let|
       letter_count_1[let] = str1.count(let)
    end`

但这给出了字符串中每个字符的总数的计数,并且一些输入在多个位置随机使用相同的字母,例如"aabbbacccdba"

那么如何按字符拆分字符串呢?

【问题讨论】:

    标签: ruby string split


    【解决方案1】:

    您可以使用带有反向引用和scan() 方法的正则表达式:

    str = "aabbbbccdddeffffgg"
    groups = []
    str.scan(/((.)\2*)/) { |x| groups.push(x[0]) }
    

    groups 之后会变成这样:

    ["aa", "bbbb", "cc", "ddd", "e", "ffff", "gg"]
    

    【讨论】:

    • @sawa 我(不幸的是)不是真正的红宝石编码器。我只是觉得解决这个问题很有趣。让我看看你的建议...
    • @sawa 你能详细说明一下吗?
    • str.scan(/((.)\2*)/).map(&:first).
    • Ruby 不错! :) 有一天我可能有机会使用它...随意将其添加到我的答案中或发布您自己的答案。将列表作为该链接命令的返回值确实是一个好处,因为我们不需要显式初始化它。
    【解决方案2】:

    这是一个非正则表达式版本

    str = "aabbbbccdddeffffgg"
    p str.chars.chunk(&:itself).map{|x|x.last.join} #=> ["aa", "bbbb", "cc", "ddd", "e", "ffff", "gg"]
    

    【讨论】:

    • 使用 Ruby v2.3.0,您可以使用 Enumerable#chunk_while: str.each_char.chunk_while { |curr,nxt| curr==nxt }.map(&:join) #=> ["aa", "bbbb", "cc", "ddd", "e", "ffff", "gg"]Enumerable.slice_when(来自 v2.2)是类似的。我还建议 each_char 而不是 chars 以避免创建临时数组。
    • 太棒了!不错!
    猜你喜欢
    • 1970-01-01
    • 2016-06-28
    • 1970-01-01
    • 2014-01-05
    • 2010-09-09
    • 2010-11-29
    • 1970-01-01
    • 2019-12-24
    • 2012-06-05
    相关资源
    最近更新 更多