2011-12-14 12 views
6

में लगातार वर्णों का मिलान अनुक्रम मेरे पास स्ट्रिंग "111221" है और लगातार बराबर पूर्णांक के सभी सेटों से मेल खाना चाहता है: ["111", "22", "1"]स्ट्रिंग

मुझे पता है कि ऐसा करने के लिए एक विशेष रेगेक्स चीज है लेकिन मुझे याद नहीं है और मैं गुगलिंग में भयानक हूं।

+1

जब इनपुट गैर अंकों वर्ण, जैसे है क्या होना चाहिए '111aaa222" 'और' "111aaa111" '? – Phrogz

उत्तर

10

मदद कर सकते हैं रूबी में regex का उपयोग करना है 1.8.7+:

p s.scan(/((\d)\2*)/).map(&:first) 
#=> ["111", "22", "1"] 

यह काम करता है क्योंकि (\d) किसी भी अंकों कैप्चर करता है, और उसके बाद \2* उस समूह (दूसरे उद्घाटन कोष्ठक) से मेल खाने वाले शून्य-या-अधिक को कैप्चर करता है। scan में परिणामस्वरूप पूरे मैच को कैप्चर करने के लिए बाहरी (…) की आवश्यकता है। अंत में, scan अकेले रिटर्न:

[["111", "1"], ["22", "2"], ["1", "1"]] 

... इसलिए हम के माध्यम से चलाने के लिए और प्रत्येक सरणी में सिर्फ पहला आइटम रखने की जरूरत है। रूबी में 1.8.6+ (जो सुविधा के लिए Symbol#to_proc नहीं है):

p s.chars.chunk{|c|c}.map{ |n,a| a.join } 
#=> ["111", "22", "1"] 
:

p s.scan(/((\d)\2*)/).map{ |x| x.first } 
#=> ["111", "22", "1"] 
कोई Regex के साथ

, यहाँ एक मजेदार एक (किसी भी चार मिलान) कि रूबी 1.9.2 में काम करता है

यहाँ एक और संस्करण है कि रूबी 1.8.6 में भी काम करना चाहिए है:

p s.scan(/./).inject([]){|a,c| (a.last && a.last[0]==c[0] ? a.last : a)<<c; a } 
# => ["111", "22", "1"] 
+1

आपका "मजेदार एक" "00aa00" से मेल खाता है [000000 "] - नमूना इनपुट पर काम करता है, लेकिन किसी भी गैर-तुच्छ उदाहरणों पर नहीं। – klochner

+0

@ klochner एएके! आप सही हैं। फिक्स्ड, धन्यवाद। – Phrogz

-2

तुम कोशिश कर सकते

string str ="111221"; 
string pattern [email protected]"(\d)(\1)+"; 

आशा आप

+1

डाउनवॉटेड क्योंकि ए) यह काम नहीं करता है (आपको '+' के बजाय '*' की आवश्यकता है) और बी) यह रूबी सिंटैक्स नहीं है, और रूबी में भी सीधे काम नहीं करता है। – Phrogz

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