2014-09-01 75 views
6

我想要製作一個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; 

爲什麼我沒有得到角色的每個組合?我應該給我的正則表達式添加什麼,以便計算每個字符組合?

回答

9

由於字符重疊,所以您需要使用前視來捕獲重疊的字符。

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

DEMO

+1

非常具有啓發性,Avinash。我以前沒有在lookaround組中看過捕獲組。很強大。 – 2014-09-01 16:14:03

+0

你可以使用積極的後顧之談'(?<=([a-z] [a-z]))',你在你刪除的評論中暗示了這一點。我認爲這值得一提。 – 2014-09-01 18:59:00

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} 

有散列,將它轉換爲任何你想要的輸出格式是一件容易的事情。

相關問題