我是ruby的新手,我试图迭代一个字符串,用每个单个实例替换重复的字符。我想使用迭代器自动化进程,所以我不必手动声明每个字符。示例字符串:
u = %q(a a a a a b b b b c c c c)
我希望变量u在确保所有重复的字符都被每个字符的单个实例替换后返回字符串“a b c”。
我试过
u.each.scan(/\w+/).join do |x|
p u.gsub(/\x+/, x)
end
那不会工作。我怎么能绕过这个?
答案 0 :(得分:3)
u.tr(" ", "").squeeze.gsub(/(?<=.)(?=.)/, " ")
# => "a b c"
或
u.tr(" ", "").squeeze.gsub("", " ").strip
# => "a b c"
答案 1 :(得分:1)
这样可行:
u = %q(a a a a a b b b b c c c c)
u.gsub(/(.)( \1)+/, '\1')
#=> "a b c"
答案 2 :(得分:0)
你可以这样做:
<强>代码强>
u.split(' ').chunk {|c| c}.map(&:first).join(' ')
=> "a b c"
<强> Explanaton 强>
u = %q(a a a a a b b b b c c c c)
a = u.split(' ')
#=> ["a", "a", "a", "a", "a", "b", "b", "b", "b", "c", "c", "c", "c"]
b = a.chunk {|c| c}
#=> #<Enumerator: #<Enumerator::Generator:0x000001010efe50>:each>
b.to_a #=> [["a", ["a", "a", "a", "a", "a"]],
# ["b", ["b", "b", "b", "b"]],
# ["c", ["c", "c", "c", "c"]]]
c = b.map(&:first)
#=> ["a", "b", "c"]
c.join(' ')
#=> "a b c"
答案 3 :(得分:0)
我能想到的最简单的方法是:
u = %q(a a a a a b b b b c c c c)
u.split.uniq.join(' ')
# => "a b c"
在我看来,没有正则表达式总是一个很好的奖励;)