Ruby:如何将包含连续字母组的字符串分成那些字母组?

时间:2019-04-03 22:31:34

标签: ruby string

我想将包含连续字母组的字符串变成

"aaabbbcccaaa"

进入:

["aaa","bbb","ccc","aaa"]

我确定这在Ruby中应该很简单,但是我很困惑。

5 个答案:

答案 0 :(得分:4)

str = "aaabbbcccaaa"

str.gsub(/(.)\1*/).to_a
  #=> ["aaa", "bbb", "ccc", "aaa"]

这使用String#gsub的形式,该形式没有块,因此返回一个枚举数。

答案 1 :(得分:0)

@Phrogz answer

的修改后的变体
$this->Session->destory();

答案 2 :(得分:0)

此变体应适用于具有2个连续字符组的任何字符串

"foo\n\nbarr".gsub(/(.)(\1)*/).select{|l| l.length >1}
#=> ["oo", "rr"]

或仅用于字母字符:

"foo\n\n??barr..bazz".gsub(/([a-zA-Z])(\1)*/).select{|l| l.length >1}
#=> ["oo", "rr", "zz"]

答案 3 :(得分:0)

Silly非正则表达式版本:

str = "aaabbbcccaaa"
str.each_char.with_object([]) { |a,r| (r.last&.end_with?(a) ? r.last : r) << a }
=> ["aaa", "bbb", "ccc", "aaa"]

答案 4 :(得分:0)

我找到了一种使用Array#slice_when而不使用正则表达式的方法:

"AAAABBBCDDD".chars.slice_when(&:!=).map(&:join)
#=> ["AAAA", "BBB", "C", "DDD"]

尽管gsub带有正则表达式(正如卡里·斯沃夫兰(Cary Swoveland在他的回答中所建议的那样))显然更快:

Benchmark.measure do
  100_000.times { "AAAABBBCDDD".chars.slice_when(&:!=).map(&:join) }  
end  

# => #<Benchmark::Tms:0x00007fb11ff9a560
#  @cstime=0.0,
#  @cutime=0.0,
#  @label="",
#  @real=1.427345999982208,
#  @stime=0.013876,
#  @total=1.3629069999999996,
#  @utime=1.3490309999999996>

Benchmark.measure do
  100_000.times { "AAAABBBCDDD".gsub(/(.)(\1)*/).to_a }
end

=> #<Benchmark::Tms:0x00007fb1214f4dc0
#  @cstime=0.0,
#  @cutime=0.0,
#  @label="",
#  @real=0.6837240000022575,
#  @stime=0.03575100000000003,
#  @total=0.64306,
#  @utime=0.6073089999999999>