नियमित अभिव्यक्ति का उपयोग करते हुए रूबी में एक स्ट्रिंग से एक विकल्प निकालें


130

मैं रूबी में स्ट्रिंग के भीतर से एक सबस्ट्रिंग कैसे निकाल सकता हूं?

उदाहरण:

String1 = "<name> <substring>"

मैं निकालना चाहते हैं substringसे String1(के अंतिम घटना के भीतर यानी सब कुछ <और >)।

जवाबों:


134
String1.scan(/<([^>]*)>/).last.first

scanएक सरणी जो, प्रत्येक के लिए बनाता <item>में String1के बीच पाठ होता है <और >(क्योंकि जब एक regex कब्जा समूहों युक्त के साथ प्रयोग किया, स्कैन प्रत्येक मैच के लिए कैप्चर युक्त एक सरणी बनाता है) एक एक तत्व सरणी में। lastआपको उन सरणियों में से अंतिम firstदेता है और फिर आपको इसमें स्ट्रिंग देता है।


319
"<name> <substring>"[/.*<([^>]*)/,1]
=> "substring"

scanयदि हमें केवल एक परिणाम की आवश्यकता है, तो उपयोग करने की आवश्यकता नहीं है । जब हम रूबी है, तो
पायथन का उपयोग करने की आवश्यकता नहीं हैmatchString[regexp,#]

देख: http://ruby-doc.org/core/String.html#method-i-5B-5D

ध्यान दें: str[regexp, capture] → new_str or nil


37
कोई अन्य पूरी तरह से मान्य (और मैं अधिक, पठनीय) समाधान को अस्वीकार करने की आवश्यकता नहीं कर सकता।
21

41
@coreyward, अगर वे बेहतर हैं, तो कृपया, इसे तर्क दें। उदाहरण के लिए, sepp2k का समाधान अधिक लचीला है, और इसीलिए मैंने if we need only one resultअपने समाधान में बताया । और match()[]धीमी है, क्योंकि यह एक के बजाय दो तरीके हैं।
Nakilon

4
प्रस्तुत सभी विधियों में से यह सबसे तेज़ है, लेकिन यहां तक ​​कि सबसे धीमी विधि मेरी मशीन पर केवल 4.5 माइक्रोसेकंड लेती है। मुझे अनुमान लगाने की परवाह नहीं है कि यह विधि अधिक तेज़ क्यों है। प्रदर्शन में, अटकलें बेकार हैं । केवल माप मायने रखता है।
वेन कॉनराड

8
मैं इस समाधान को और अधिक सीधा और बिंदु पर पाता हूं (जब से मैं रूबी के लिए नया हूं)। धन्यवाद।
रयान एच।

@Nakilon पठनीयता उत्पाद और टीम की समग्र सफलता पर विचार करते समय छोटे प्रदर्शन मतभेदों को पछाड़ सकती है, इसलिए कोरीवर्ड ने एक वैध टिप्पणी की। उस ने कहा, मुझे लगता है कि string[regex]इस परिदृश्य में केवल पठनीय हो सकता है, इसलिए यही मैंने व्यक्तिगत रूप से उपयोग किया है।
निक

24

आप बहुत आसानी से…

शब्द के आसपास रिक्त स्थान आवंटित करना (लेकिन उन्हें नहीं रखना):

str.match(/< ?([^>]+) ?>\Z/)[1]

या बिना रिक्त स्थान की अनुमति के:

str.match(/<([^>]+)>\Z/)[1]

1
मुझे यकीन नहीं है कि <>वास्तव में स्ट्रिंग में आखिरी चीज होने की आवश्यकता है। यदि उदाहरण के लिए स्ट्रिंग foo <bar> bazकी अनुमति है (और परिणाम देने वाला है bar), तो यह काम नहीं करेगा।
sepp2k

मैं सिर्फ उनके द्वारा प्रदान किए गए सैंपल स्ट्रिंग पर आधारित था।
21

10

यहां matchविधि का उपयोग करके थोड़ा अधिक लचीला दृष्टिकोण है । इसके साथ, आप एक से अधिक स्ट्रिंग निकाल सकते हैं:

s = "<ants> <pants>"
matchdata = s.match(/<([^>]*)> <([^>]*)>/)

# Use 'captures' to get an array of the captures
matchdata.captures   # ["ants","pants"]

# Or use raw indices
matchdata[0]   # whole regex match: "<ants> <pants>"
matchdata[1]   # first capture: "ants"
matchdata[2]   # second capture: "pants"

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.