रूबी रेगेक्स का पहला मैच लौटाएं


97

मैं रूबी में एक स्ट्रिंग पर एक रेगेक्स मैच का प्रदर्शन करने का एक तरीका ढूंढ रहा हूं और पहले मैच में यह शॉर्ट-सर्किट है।

मैं जिस स्ट्रिंग की प्रोसेसिंग कर रहा हूं, वह लंबी है और उसमें से जो दिखता है, वह मानक तरीका ( matchतरीका) पूरी चीज को प्रोसेस करेगा, प्रत्येक मैच को इकट्ठा करेगा, और सभी मैचों से मेल खाता ऑब्जेक्ट लौटाएगा।

match = string.match(/regex/)[0].to_s

जवाबों:


134

आप कोशिश कर सकते हैं variableName[/regular expression/]। यह irb से एक उदाहरण आउटपुट है:

irb(main):003:0> names = "erik kalle johan anders erik kalle johan anders"
=> "erik kalle johan anders erik kalle johan anders"
irb(main):004:0> names[/kalle/]
=> "kalle"

क्या यह मैच नहीं कर रहा है और पर्दे के पीछे से पहला परिणाम लौटा रहा है?
गिशु

7
विभिन्न लंबाई के तार के साथ कुछ बेंचमार्किंग और सी स्रोत को देखने के बाद, यह पता चलता है कि रेगेक्स.मैच शॉर्ट-सर्किट करता है और केवल पहला मैच पाता है।
डैनियल बर्ड्सले

3
नीट, इस शॉर्टकट के बारे में नहीं जानता था।
पियरे

क्या इस शॉर्टकट पर कुछ प्रलेखन है? मैंने जो कुछ सोचा था उसके लिए मैंने उच्च और निम्न को खोजा जो एक अपेक्षाकृत सरल कार्य था और इसे खोजने के बाद ही मैंने अपने मुद्दे को हल किया। धन्यवाद!
दिनराती

5
@ मड़ौती आप स्ट्रिंग # [ में प्रलेखित इस सुविधा को पा सकते हैं । डॉक के बारे में पूछने के लिए धन्यवाद, क्योंकि इसे पढ़ने में मुझे captureतर्क मिला - जो आपको पूर्ण मैच के बजाय कैप्चर वापस करने देता है।
आलस

68

आप उपयोग कर सकते हैं []: (जो पसंद है match)

"foo+account2@gmail.com"[/\+([^@]+)/, 1] # matches capture group 1, i.e. what is inside ()
# => "account2"
"foo+account2@gmail.com"[/\+([^@]+)/]    # matches capture group 0, i.e. the whole match
# => "+account2"

4
सबसे अच्छा पूर्ण उत्तर
akostadinov

23

यदि केवल एक मैच का अस्तित्व महत्वपूर्ण है, तो आप साथ जा सकते हैं

/regexp/ =~ "string"

किसी भी तरह से, matchकेवल पहले हिट को वापस करना चाहिए, जबकि scanपूरे स्ट्रिंग में खोज करना चाहिए । इसलिए यदि

matchData = "string string".match(/string/)
matchData[0]    # => "string"
matchData[1]    # => nil - it's the first capture group not a second match

8

मुझे अभी तक यकीन नहीं है कि यह सुविधा कमाल की है या पूरी तरह से पागल है, लेकिन आपका रेगेक्स स्थानीय चर को परिभाषित कर सकता है।

/\$(?<dollars>\d+)\.(?<cents>\d+)/ =~ "$3.67" #=> 0
dollars #=> "3"

( Http://ruby-doc.org/core-2.1.1/Regexp.html से लिया गया )।


बहुत बढ़िया सुविधा! बस मुझे क्या चाहिए
राफैमेक्स

regex =~ string", not when कैविएट : यह केवल तभी काम करता है जब स्ट्रिंग = ~ रेगेक्स`
क्रिस्टोफर ओजबेक

2

एक नियमित अभिव्यक्ति (regex) एक सीमित राज्य मशीन (FSM) के अलावा कुछ भी नहीं है।

एक FSM प्रश्न का उत्तर देने का प्रयास करता है "क्या यह राज्य संभव है या नहीं?"

यह एक पैटर्न मैच बनाने का प्रयास करता रहता है जब तक कि कोई मैच नहीं मिला (सफलता), या जब तक कि सभी रास्तों की खोज न हो जाए और कोई मैच न मिले (असफलता)।

सफलता पर, सवाल "क्या यह संभव है या नहीं?" एक "हाँ" के साथ उत्तर दिया गया है। इसलिए कोई और मिलान आवश्यक नहीं है और रेगेक्स रिटर्न।

देखें इस और इस इस बारे में अधिक के लिए।

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

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