रूबी में "स्प्लिट" विधि का उपयोग कैसे करें

जैसा कि आप पहले से ही जानते हैं, में तार माणिक के रूप में जाना जाता है प्रथम श्रेणी की वस्तुएँ कि प्रश्नों और हेरफेर के लिए कई तरीकों का उपयोग करें।

सबसे बुनियादी में से एक स्ट्रिंग हेरफेर क्रियाओं को एक स्ट्रिंग को कई उप-स्ट्रिंग्स में विभाजित करना है। यह किया जाएगा, उदाहरण के लिए, यदि आपके पास एक स्ट्रिंग है"फू, बार, बाज" और आप तीन तार चाहते हैं "फू", "बार", और "बाज". विभाजित करें स्ट्रिंग कक्षा की विधि आपके लिए इसे पूरा कर सकती है।

"स्प्लिट" का मूल उपयोग

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

#! / usr / bin / env माणिक
str = "फू, बार, बाज"
str.split (",") डालता है
$ ./1.rb
foo
बार
baz

नियमित भाव के साथ लचीलापन जोड़ें

परिसीमन करने के आसान तरीके हैं तार. एक नियमित अभिव्यक्ति का उपयोग करना क्योंकि आपका सीमांकक विभाजन विधि को और अधिक लचीला बनाता है।

instagram viewer

फिर से, उदाहरण के लिए स्ट्रिंग लें "फू, बार, बाज". पहले अल्पविराम के बाद एक स्थान है, लेकिन दूसरे के बाद नहीं। यदि स्ट्रिंग "," को सीमांकक के रूप में उपयोग किया जाता है, तो "बार" स्ट्रिंग की शुरुआत में एक स्थान अभी भी मौजूद होगा। यदि स्ट्रिंग "," का उपयोग किया जाता है (अल्पविराम के बाद एक स्थान के साथ), यह केवल पहले अल्पविराम से मेल खाएगा क्योंकि दूसरे अल्पविराम में इसके बाद स्थान नहीं है। यह बहुत सीमित है।

इस समस्या का समाधान एक स्ट्रिंग के बजाय अपने सीमांकक तर्क के रूप में एक नियमित अभिव्यक्ति का उपयोग करना है। नियमित अभिव्यक्तियाँ आपको न केवल पात्रों के स्थिर दृश्यों से मेल खाने की अनुमति देती हैं, बल्कि वर्णों और वैकल्पिक वर्णों की अनिश्चित संख्या भी बताती हैं।

नियमित अभिव्यक्ति लेखन

अपने सीमांकक के लिए एक नियमित अभिव्यक्ति लिखते समय, पहला कदम शब्दों में वर्णन करना है कि सीमांकक क्या है। इस मामले में, वाक्यांश "एक अल्पविराम जिसके बाद एक या अधिक रिक्त स्थान हो सकते हैं" उचित है।

इस regex के दो तत्व हैं: अल्पविराम और वैकल्पिक स्थान। रिक्त स्थान * (तारा, या तारांकन) मात्रा का उपयोग करेगा, जिसका अर्थ है "शून्य या अधिक।" इससे पहले कोई भी तत्व शून्य या अधिक बार मेल खाएगा। उदाहरण के लिए, रेगेक्स /a*/ शून्य या अधिक 'a' वर्णों के अनुक्रम से मेल खाएगा।

#! / usr / bin / env माणिक
str = "फू, बार, बाज"
str.split (/, * /) डालता है
$ ./2.rb
foo
बार
baz

विभाजन की संख्या को सीमित करना

एक अल्पविराम से अलग मान स्ट्रिंग की कल्पना करें जैसे "10,20,30, यह एक मनमाना स्ट्रिंग है". यह प्रारूप एक टिप्पणी कॉलम के बाद तीन नंबर है। इस टिप्पणी कॉलम में मनमाने ढंग से पाठ शामिल हो सकते हैं, इसमें अल्पविराम के साथ पाठ भी शामिल है। रोकने के लिए विभाजित करें इस स्तंभ के पाठ को विभाजित करने से, हम अधिकतम संख्या में स्तंभों को विभाजित करने के लिए सेट कर सकते हैं।

ध्यान दें: यह केवल तभी काम करेगा जब मनमाना पाठ वाला टिप्पणी स्ट्रिंग तालिका का अंतिम कॉलम हो।

विभाजन की संख्या को विभाजित करने के लिए विभाजित विधि प्रदर्शन करेगी, विभाजित विधि के दूसरे तर्क के रूप में स्ट्रिंग में फ़ील्ड की संख्या को पास करें, जैसे:

#! / usr / bin / env माणिक
str = "10,20,30, दस, बीस और तीस"
str.split (/, * /, 4) डालता है
$ ./3.rb
10
20
30
दस, बीस और तीस

बोनस उदाहरण!

यदि आप उपयोग करना चाहते हैं तो क्या होगा विभाजित करें सभी वस्तुओं को प्राप्त करने के लिए लेकिन बहुत पहले?

यह वास्तव में बहुत सरल है:

सबसे पहले, * बाकी = ex.split (/, /)

सीमाएं जानना

विभाजन विधि की कुछ बड़ी सीमाएँ हैं।

उदाहरण के लिए स्ट्रिंग लें '10, 20, "बॉब, ईव और मैलोरी", 30 '. क्या इरादा है दो संख्याओं का, इसके बाद एक उद्धृत स्ट्रिंग (जिसमें अल्पविराम शामिल हो सकता है) और फिर एक और संख्या है। स्प्लिट सही तरीके से इस स्ट्रिंग को खेतों में अलग नहीं कर सकता है।

ऐसा करने के लिए, स्ट्रिंग स्कैनर होना चाहिए स्टेटफुल, जिसका अर्थ है कि यह याद रख सकता है कि यह एक उद्धृत स्ट्रिंग के अंदर है या नहीं। स्प्लिट स्कैनर स्टेटफुल नहीं है, इसलिए यह इस तरह की समस्याओं को हल नहीं कर सकता है।

instagram story viewer