Ruby:迭代一个String并替换字符

时间:2014-04-09 16:08:46

标签: ruby regex loops iterator gsub

我是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

那不会工作。我怎么能绕过这个?

4 个答案:

答案 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"

在我看来,没有正则表达式总是一个很好的奖励;)