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*/)
बस पहले कैप्चरिंग समूह है, जिसका अर्थ है कि हम केवल संभवतः दोहराया संख्या का एक अनुक्रम से एक अंक मिलता था से बाहर एक सरणी का उत्पादन होगा।)
मुझे नहीं लगता कि एक 'split' विधि काम करेगी, क्योंकि ये 'स्प्लिट' से मेल खाने वाले अक्षरों को हटा दें। मुझे लगता है कि आपको इसके बजाय स्ट्रिंग पर फिर से चलने की आवश्यकता हो सकती है। उत्कृष्ट स्पष्टीकरण के लिए – Oliver