2016-02-03 43 views
2

如果我有一個字符串,例如"aabbbbccdddeffffgg",並且我想將字符串拆分爲這個數組:["aa", "bbbb", "cc", "ddd", "e", "ffff", "gg"],那我該怎麼辦?如何分割不均勻量的重複字符串? Ruby

我知道string.split/.../ <或無論多少時間,你放在那裏,但它不考慮如果字符串不平衡。我正在處理的問題的關鍵在於取兩個字符串,看看一個字符串的行中是否有三個字符,另一個字符串中是否有兩個字符。我試圖

`letter_count_1 = {} 
    str1.each_char do |let| 
     letter_count_1[let] = str1.count(let) 
    end` 

但是,這給出了字符串中的每個字符的總量計,和一些輸入與在多個地方,喜歡同樣的字母隨機,"aabbbacccdba"

那麼怎麼辦你按字符分割字符串?

回答

2

您可以使用正則表達式有一個反向引用和scan()方法:

str = "aabbbbccdddeffffgg" 
groups = [] 
str.scan(/((.)\2*)/) { |x| groups.push(x[0]) } 

groups看起來像這樣算賬:

["aa", "bbbb", "cc", "ddd", "e", "ffff", "gg"] 
+0

'地圖(&:第一)'也將工作。 – sawa

+0

@sawa我(不幸)不是一個真正的紅寶石編碼器。我發現解決這個問題很有趣。讓我檢查你的建議... – hek2mgl

+0

@sawa你能詳細說明一下嗎? – hek2mgl

-2

無法正則表達式可以幫助您嗎?

"aaaqda".scan(/a{3}/) 
=> ["aaa"] 
+0

這是如何提供所需的輸出? –

+0

它不應該提供所需的輸出。我想做一個幫助,沒有解決他的問題:) – Ursus

3

這裏是

非正則表達式版本
str = "aabbbbccdddeffffgg" 
p str.chars.chunk(&:itself).map{|x|x.last.join} #=> ["aa", "bbbb", "cc", "ddd", "e", "ffff", "gg"] 
+0

使用Ruby v2.3.0,您可以使用[Enumerable#chunk_while](http://ruby-doc.org/core-2.3.0/Enumerable.html#method-i-chunk_while):'str.each_char.chunk_while {| curr ,NXT | curr == nxt} .map(&:join) #=> [「aa」,「bbbb」,「cc」,「ddd」,「e」,「ffff」,「gg」]'。 [Enumerable.slice_when](http://ruby-doc.org/core-2.3.0/Enumerable.html#method-i-slice_when)(來自v2.2)類似。我還建議''chars'上的'each_char'來避免創建臨時數組。 –