如何在Ruby中分割包含不同数量重复字符的字符串?

3
如果我有一个字符串,例如"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"

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

2个回答

4

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

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

groups之后看起来像这样:

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

@sawa 很遗憾,我并不是一个Ruby程序员。我只是觉得解决这个问题很有趣。让我看看你的建议... - hek2mgl
@sawa 你能详细说明一下吗? - hek2mgl
str.scan(/((.)\2*)/).map(&:first) - sawa
Ruby很不错!:) 有一天我可能会有机会与它一起工作... 随意将其添加到我的答案中或发布您自己的答案。由于我们不需要显式初始化,因此将该链接命令的列表作为返回值确实是一个好处。 - hek2mgl

4
这里有一个非正则表达式版本。
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_whilestr.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,以避免创建临时数组。 - Cary Swoveland
了不起!棒极了! - Alex Strizhak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接