计算两个字母一起出现的次数

时间:2014-09-01 15:11:40

标签: ruby regex

我正在尝试制作一个Ruby程序,它计算两个字母一起出现的次数。这就是我正在阅读的文件中写的内容:

hola
chau

这就是我想要的:

ho;ol;la;ch;ha;au;
1;1;1;1;1;1;

我无法让它正常工作。到目前为止,这是我的代码:

file = File.read(gets.chomp)
todo = file.scan(/[a-z][a-z]/).each_with_object(Hash.new(0)) { 
    |a, b| b[a] += 1 
}

keys  = ''
values = ''

todo.each_key {
    |key| keys += key + ';' 
}
todo.each_value {
    |value| values += value.to_s + ';'
}

puts keys
puts values

这是我得到的结果:

ho;la;ch;au;
1;1;1;1;

为什么我没有得到每个角色的组合?我应该对我的正则表达式做什么,以便计算每个字符组合?

2 个答案:

答案 0 :(得分:9)

由于字符重叠,您需要使用前瞻来捕获重叠的字符。

(?=([a-z][a-z]))

DEMO

答案 1 :(得分:2)

这是一种方式。

def char_pairs(str)
  str.split(/\s+/).flat_map { |w| w.chars.each_cons(2).map(&:join) }
                  .each_with_object({}) { |e,h| h[e] = (h[e] ||= 0 ) + 1 }
end

char_pairs("hello jello")
  #=> {"he"=>1, "el"=>2, "ll"=>2, "lo"=>2, "je"=>1}

char_pairs("hello yellow jello")
  #=> {"he"=>1, "el"=>3, "ll"=>3, "lo"=>3, "ye"=>1, "ow"=>1, "je"=>1}

使用哈希,将它转换为您想要的任何输出格式都很容易。