2012-08-22 24 views
20

मैं वेब पेजों से निकाले गए कुछ टेक्स्ट डेटा को पैच करना चाहता हूं। नमूना:जब मैं समूह का उपयोग करता हूं तो gsub के साथ रूबी नियमित अभिव्यक्ति (regex) में बैकरेफर कैसे करें?

t="First sentence. Second sentence.Third sentence." 

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

मैं इस regexp का उपयोग "\ n" वर्ण को उचित स्थानों में डालने और अपने पाठ को पैच करने के लिए करना चाहता हूं। मेरे regex:

t2=t.gsub(/([.\!?])([A-Z1-9])/,$1+"\n"+$2) 

लेकिन दुर्भाग्य से यह काम नहीं करता: "NoMethodError: अपरिभाषित विधि` + 'के बराबर के लिए: NilClass " मैं कैसे ठीक से मिलान किया समूहों के लिए backreference कर सकते हैं? माइक्रोसॉफ्ट वर्ड में यह इतना आसान था, मुझे बस \ 1 और \ 2 प्रतीकों का उपयोग करना पड़ा।

+2

क्रमांकित ग्लोबल्स ('$ 1',' $ 2', ...) दूसरे तर्क का मूल्यांकन होने पर सेट नहीं होते हैं, वे ब्लॉक पर पहुंचने से पहले 'gsub' द्वारा सेट किए जाते हैं। इसलिए '' 1'' का उपयोग कब और '$ 1' का उपयोग कब करें' पर सोया की सलाह। –

उत्तर

27

आप \1 (कैप्चर समूह 1 से मिलान करने के लिए) प्रतिस्थापन स्ट्रिंग में बैकरेफर कर सकते हैं।

t = "First sentence. Second sentence.Third sentence!Fourth sentence?Fifth sentence." 
t.gsub(/([.!?])([A-Z1-9])/, "\\1\n\\2") # => "First sentence. Second sentence.\nThird sentence!\nFourth sentence?\nFifth sentence." 
19
  • आप gsub(regex, replacement) का उपयोग कर रहे हैं, तो '\1', '\2' ... मैच का उल्लेख करने का उपयोग करें। सुनिश्चित करें कि replacement के आस-पास डबल कोट्स न डालें, या फिर यहोशू के जवाब में बैकस्लैश से बचें। मैच में '\1' से रूपांतरण gsub के भीतर किया जाएगा, शाब्दिक व्याख्या द्वारा नहीं।
  • आप gsub(regex){replacement} का उपयोग कर रहे हैं, तो का उपयोग $1, $1, ...

लेकिन आपके मामले के लिए, यह मैचों का उपयोग नहीं आसान है:

t2 = t.gsub(/(?<=[.\!?])(?=[A-Z1-9])/, "\n") 
+1

उसे नई लाइन या '\ 1' + "\ n" + '\ 2'' प्राप्त करने के लिए डबल कोट्स का उपयोग करना होगा। –

+0

@muistooshort ओपी मूल रूप से '+' का उपयोग कर रहा है, इसलिए आपने जो कुछ दिया था वह मेरे मन में था। – sawa

6

तुम यहाँ मिला है की वजह से रुबोकॉप शिकायत करते हैं "पर्ल-स्टाइल बैकफ्र्स के उपयोग से बचें।" के बारे में आदि $ 1, $ 2, ... आप इस के बजाय कर सकते हैं कर सकते हैं:

some_id = $1 
# or 
some_id = Regexp.last_match[1] if Regexp.last_match 

some_id = $5 
# or 
some_id = Regexp.last_match[5] if Regexp.last_match 

यह भी आप

%r{//}.match(some_string) 
बजाय

some_string[//] 

लेम के लिए करना चाहेंगे (Rubocop)