2012-03-27 18 views
80

मैं मुसीबत रूबी में इस अनुवाद हो रहा है के साथ स्ट्रिंग की जगह।रूबी पर कब्जा कर लिया regex पैटर्न

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

मैं gsub, sub, और replace की कोशिश की है, लेकिन कोई भी मैं क्या उम्मीद कर रहा हूँ करने के लिए लग रहे हैं:

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

"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 } 
+0

आप आप क्या है के लिए वास्तविक कोड दिखाएगी कोशिश की। – Amber

+0

@Amber मैंने नमूना लगाया मैंने कोशिश की है। –

उत्तर

138

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

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

लेकिन

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

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

नोट यह केवल काम करता है प्रतिस्थापन स्ट्रिंग ** एकल उद्धरण के अंदर है अगर है कि **। मैंने इसे समझने में 5 मिनट बर्बाद कर दिया। –

+7

@MarkThomas - अक्सर कई बार हम शीर्ष/स्वीकार किए जाते हैं जवाब पहले जवाब के पूरी तरह पढ़ने के बिना प्रयास करें। ऐसा लगता है कि एक समस्या को ठीक करने का सबसे प्रभावी माध्यम है। विकी को एक ब्रेक दें! :) –

+0

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

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

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

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

या

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

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

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

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

या

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

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

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

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

1

आप कुछ परिणामों को फ़िल्टर करने के लिए एक 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" 
संबंधित मुद्दे

 संबंधित मुद्दे