2010-09-06 9 views
5

यह मैंRegex - सहेजा जा रहा है कब्जा कर लिया दोहराया जाने वाला समूह

a = "%span.rockets#diamonds.ribbons.forever" 
a = a.match(/(^\%\w+)([\.|\#]\w+)+/) 
puts a.inspect 

क्या कर रहा यह मैं क्या मिलेगा

#<MatchData "%span.rockets#diamonds.ribbons.forever" 1:"%span" 2:".forever"> 

यह जो मैं चाहता

#<MatchData "%span.rockets#diamonds.ribbons.forever" 1:"%span" 2:".rockets" 3:".#diamonds" 4:".ribbons" 5:".forever"> 

मदद है क्या है? मैंने कोशिश की और विफल :(

उत्तर

3

कैसे कब्जा समूहों के कार्य आप उन सबस्ट्रिंग के सभी को बचाने के लिए, परिमाणक अंदर कैप्चरिंग समूह डाल चाहते हैं है कि बस:।

a = a.match(/(^%\w+)((?:[.#]\w+)+)/) 

फिर अपने दूसरे पर कब्जा हो जाएगा :।

2:".rockets#diamonds.ribbons.forever" 

... और आप इसे नीचे रास्ता खुद के बाकी तोड़ सकते हैं

8

आमतौर पर, आप नहीं मिल सकता है कब्जा समूहों में से एक मनमाना संख्या, लेकिन अगर आप scan का उपयोग आप एक मैच हर टोकन के लिए आप कैप्चर करना चाहते प्राप्त कर सकते हैं:

a = "%span.rockets#diamonds.ribbons.forever" 
a = a.scan(/^%\w+|\G[.|#]\w+/) 
puts a.inspect 

["%span", ".rockets", "#diamonds", ".ribbons", ".forever"] 

यह आपके regex से बहुत अलग नहीं है, लेकिन मैं पर पुनरावृत्ति हटाया अंतिम टोकन \G बहुत अच्छी तरह से ज्ञात नहीं है - यह इंजन से मेल खाता है जहां पिछले मैच समाप्त हुआ था, इसलिए जब आप मैचों (%span :P .rockets) के बीच अतिरिक्त वर्ण रखते हैं तो यह तोड़ नहीं आता है।

आम तौर पर, यदि आपके मूल रेगेक्स के कई मैचों में यह विधि कुछ कार्य जोड़ सकती है, क्योंकि आपके पास समूह से अलग समूह नहीं हैं, लेकिन match एक परिणाम देता है तो इसे ठीक काम करना चाहिए।

कार्य उदाहरण: http://ideone.com/nnmki

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