我想将包含连续字母组的字符串变成
"aaabbbcccaaa"
进入:
["aaa","bbb","ccc","aaa"]
我确定这在Ruby中应该很简单,但是我很困惑。
答案 0 :(得分:4)
str = "aaabbbcccaaa"
str.gsub(/(.)\1*/).to_a
#=> ["aaa", "bbb", "ccc", "aaa"]
这使用String#gsub的形式,该形式没有块,因此返回一个枚举数。
答案 1 :(得分:0)
$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>