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


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

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

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 }

89
2018-03-27 22:10


मूल


आपने जो कोशिश की है उसके लिए आपको वास्तविक कोड दिखाना चाहिए। - Amber
@Amber मैंने नमूना लगाया मैंने कोशिश की है। - JD Isaacks


जवाब:


प्रयत्न '\1' प्रतिस्थापन के लिए (एकल कोट महत्वपूर्ण हैं, अन्यथा आपको बचने की जरूरत है \):

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

लेकिन चूंकि आपको केवल कैप्चर समूह में दिलचस्पी दिखाई देती है, ध्यान दें कि आप एक स्ट्रिंग के साथ स्ट्रिंग को इंडेक्स कर सकते हैं:

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

149
2018-03-27 22:14



ध्यान दें कि यह केवल तभी काम करता है जब प्रतिस्थापन स्ट्रिंग अंदर है एकल कोट। मैंने इसे समझने में 5 मिनट बर्बाद कर दिया। - Vicky Chijwani
@MarkThomas - अक्सर हम जवाबों की पूरी तरह पढ़े बिना पहले शीर्ष / स्वीकृत उत्तर का प्रयास करते हैं। ऐसा लगता है कि एक समस्या को ठीक करने का सबसे प्रभावी माध्यम है। विकी को एक ब्रेक दें! :) - Josh M.
@ विकी सिजवानी अच्छी टिप्पणी, लेकिन यह भी ध्यान दें कि रूबी इनलाइन का उपयोग करते समय (कमांड लाइन पर -e), यह देखने की अधिक संभावना है डबल उद्धरण: printf "Punkinhead the name" | ruby -ne 'puts gsub /.*(the name)/, "Jonathans \\1"' क्योंकि अभिव्यक्ति प्रदान की गई -e आमतौर पर एकल उद्धरण में लपेटा जाता है। - Jonathan Komar
स्ट्रिंग में पैटर्न की सभी घटनाओं के लिए यह कैसे करें? - Jagdeep Singh
@JagdeepSingh, यह डिफ़ॉल्ट रूप से, सभी घटनाओं को बदल देता है। - Iulian Onofrei


\1 डबल कोट्स में भागने की जरूरत है। तो आप या तो चाहते हैं

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

या

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

देख gsub पर दस्तावेज़ जहां यह कहता है "यदि यह एक डबल-उद्धृत स्ट्रिंग है, तो दोनों बैक-रेफरेंस एक अतिरिक्त बैकस्लैश से पहले होना चाहिए।"

ऐसा कहा जा रहा है, अगर आप सिर्फ मैच के परिणाम चाहते हैं तो आप कर सकते हैं:

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

या

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

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


31
2018-03-27 22:20





 "foobar".gsub(/(o+)/){|s|s+'ball'}
 #=> "fooballbar"

9
2018-02-07 23:12



मुझे नहीं पता था कि मैं ऐसा कर सकता हूं। अच्छा! - vreen


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

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"

2
2017-10-20 17:10





def get_code(str)
  str.sub(/^(Z_.*): .*/, '\1')
end
get_code('Z_foo: bar!') # => "Z_foo"

1
2018-03-27 22:14