रूबी कैप्चर रेगेक्स पैटर्न के साथ स्ट्रिंग को बदलें


121

मुझे रूबी में इसका अनुवाद करने में परेशानी हो रही है।

यहाँ जावास्क्रिप्ट का एक टुकड़ा है जो वास्तव में मैं क्या करना चाहता है:

function get_code(str){
    return str.replace(/^(Z_.*): .*/,"$1")​​​​​​​​​​​​​​​​​​​​​​​​​​​;
}

मैंने gsub , उप और प्रतिस्थापित करने की कोशिश की है , लेकिन कोई भी ऐसा नहीं कर रहा है जो मैं उम्मीद कर रहा हूं।

यहाँ उन चीज़ों के उदाहरण दिए गए हैं जिन्हें मैंने आज़माया है:

"Z_sdsd: sdsd".gsub(/^(Z_.*): .*/) { |capture| capture }
"Z_sdsd: sdsd".gsub(/^(Z_.*): .*/, "$1")
"Z_sdsd: sdsd".gsub(/^(Z_.*): .*/, "#{$1}")
"Z_sdsd: sdsd".gsub(/^(Z_.*): .*/, "\1")
"Z_sdsd: sdsd".gsub(/(.).*/) { |capture| capture }

आपने जो कोशिश की है, उसके लिए आपको वास्तविक कोड दिखाना चाहिए।
अंबर

@ मैं मैंने जो भी नमूना पेश किया है, उसमें मैंने कोशिश की है।
जेडी इसाकेस

जवाबों:


192

'\1'प्रतिस्थापन के लिए प्रयास करें ( एकल उद्धरण महत्वपूर्ण हैं, अन्यथा आपको भागने की आवश्यकता है \):

"foo".gsub(/(o+)/, '\1\1\1')
#=> "foooooo"

लेकिन जब से आप केवल कैप्चर समूह में रुचि रखते हैं, ध्यान दें कि आप एक स्ट्रिंग को रेगेक्स के साथ अनुक्रमित कर सकते हैं:

"foo"[/oo/]
#=> "oo"
"Z_123: foobar"[/^Z_.*(?=:)/]
#=> "Z_123"

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

7
@MarkThomas - अक्सर हम जवाबों की संपूर्णता को पढ़े बिना पहले शीर्ष / स्वीकृत उत्तर की कोशिश करते हैं। ऐसा लगता है कि आम तौर पर एक समस्या को ठीक करने का सबसे कुशल साधन है। विक्की को छुट्टी दे दो! :)
जोश एम।

@VickyChijwani अच्छी टिप्पणी, लेकिन यह भी ध्यान दें कि रूबी इनलाइन (साथ कमांड लाइन पर -e) का उपयोग करते समय , यह दोहरे उद्धरण चिह्नों को देखने की अधिक संभावना है : printf "Punkinhead the name" | ruby -ne 'puts gsub /.*(the name)/, "Jonathans \\1"'क्योंकि प्रदान की गई अभिव्यक्ति -eआमतौर पर एकल उद्धरणों में लपेटी जाती है ।
जोनाथन कोमार

स्ट्रिंग में पैटर्न की सभी घटनाओं के लिए यह कैसे करें?
जगदीप सिंह

1
@ जगदीपसिंह, यह, डिफ़ॉल्ट रूप से, सभी घटनाओं को बदल देता है।
इलियान ओनोफ्रेई

36

\1दोहरे उद्धरण चिह्नों में बच निकलने की जरूरत है। तो आप भी चाहते हैं

"Z_sdsd: sdsd".gsub(/^(Z_.*): .*/, "\\1")

या

"Z_sdsd: sdsd".gsub(/^(Z_.*): .*/, '\1')

देख gsub पर डॉक्स , जहां "यदि यह एक डबल-कोटेड स्ट्रिंग है, दोनों पीछे के संदर्भ में एक अतिरिक्त बैकस्लैश से पहले आना चाहिए।"

कहा जा रहा है, यदि आप केवल उस मैच का परिणाम चाहते हैं जो आप कर सकते हैं:

"Z_sdsd: sdsd".scan(/^Z_.*(?=:)/)

या

"Z_sdsd: sdsd"[/^Z_.*(?=:)/]

ध्यान दें कि (?=:)एक गैर-कैप्चरिंग समूह है ताकि :आपके मैच में दिखाई न दे।



5

यदि आपको कुछ परिणामों को फ़िल्टर करने के लिए एक regex का उपयोग करने की आवश्यकता है, और केवल कैप्चर समूह का उपयोग करें, तो आप निम्न कार्य कर सकते हैं:

str = "Leesburg, Virginia  20176"
state_regex = Regexp.new(/,\s*([A-Za-z]{2,})\s*\d{5,}/)
# looks for the comma, possible whitespace, captures alpha,
# looks for possible whitespace, looks for zip

> str[state_regex]
=> ", Virginia  20176"

> str[state_regex, 1] # use the capture group
=> "Virginia"


0

$ चरों को केवल ब्लॉक में मिलान के लिए सेट किया जाता है:

"Z_sdsd: sdsd".gsub(/^(Z_.*): .*/) { "#{ $1.strip }" }

यह मैच पर एक विधि को कॉल करने का एकमात्र तरीका भी है। यह मैच नहीं बदलेगा, केवल strip"\" (इसे अपरिवर्तित छोड़ते हुए):

"Z_sdsd: sdsd".gsub(/^(Z_.*): .*/, "\\1".strip)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.