2012-02-15 17 views
11

मैं इस स्ट्रिंग को कैसे विभाजित करूं।अक्षर या स्थान दोहराकर रूबी स्प्लिट स्ट्रिंग

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

मैं इस कोशिश की, लेकिन यह काम नहीं किया।

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

मुझे नहीं लगता कि एक 'split' विधि काम करेगी, क्योंकि ये 'स्प्लिट' से मेल खाने वाले अक्षरों को हटा दें। मुझे लगता है कि आपको इसके बजाय स्ट्रिंग पर फिर से चलने की आवश्यकता हो सकती है। उत्कृष्ट स्पष्टीकरण के लिए – Oliver

उत्तर

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। –

+0

यह बहुत उपयोगी था, धन्यवाद। – Robin

संबंधित मुद्दे