2012-02-15 84 views
11

如何分割此字符串。ruby​​通過重複字符或空格分割字符串

"6885558 8866887777" => ["6", "88", "555", "8", "88", "66", "88", "7777"] 

我試過這個,但它沒有奏效。

ruby-1.8.7-p334 :020 > "111133".split(/(\d)\1+/) 
=> ["", "1", "", "3"] 
+0

我不認爲一個'split'方法將起作用,因爲這些方法會刪除由「split」匹配的字符。我想你可能需要迭代字符串。 – Oliver 2012-02-15 11:21:23

回答

24

split將只使用任何它作爲分隔符相匹配,從有問題的字符串,刪除它。什麼你要找的是scan

str = "6885558 8866887777" 
str.scan(/((\d)\2*)/).map(&:first) 
# => ["6", "88", "555", "8", "88", "66", "88", "7777"] 

服用慢,\d任何數字相匹配。它在第二個捕獲組中,所以\2*然後匹配任何進一步的相同數字。這將產生一個數組,看起來像

[["6", "6"], ["88", "8"], ["555", "5"], ["8", "8"], 
["88", "8"], ["66", "6"], ["88", "8"], ["7777", "7"]] 

由於我們只希望在每個這些子陣列的第一個項目,我們可以收集所有與map(&:first)

(請注意,str.scan(/(\d)\1*/)只會產生一個數組出第一個捕獲組,這意味着我們就只能從可能重複的數字序列得到一個數字的。)

+2

+1爲優秀的解釋。 – 2012-02-15 12:44:37

+0

這很有幫助,謝謝。 – Robin 2013-03-28 04:09:39