2012-01-18 7 views
9

मैं पैटर्न के भाग को प्रतिस्थापित करना चाहता हूं, पैटर्न के भाग को प्रतिस्थापित करना चाहता हूं, और प्रतिस्थापन स्ट्रिंग के हिस्से के रूप में पैटर्न के भीतर एक चर का उपयोग करना चाहता हूं।रेगेक्स: मैं पैटर्न के भाग को कैसे बदलूं और इसके भीतर एक चर का संदर्भ कैसे दूं?

क्या यह सही है?

/s/^((\s+)private\sfunction\s__construct\(\))/(2)def\s__init__

अंग्रेजी में: खाली स्थान के की एक ही राशि और स्ट्रिंग के साथ स्ट्रिंग "private function __construct()" के बाद खाली स्थान के लिए किसी भी मात्रा बदलें। तो, क्या मेरा रेगेक्स खराब है या क्या?

partial replace

+1

आप इस भाषा का उपयोग किस भाषा/अनुप्रयोग में कर रहे हैं? (वह भाषा नहीं है जिसमें आपका डेटा है। वह अभिव्यक्ति निष्पादित कर रहा है।) – FakeRainBrigand

+0

@ फेकरेनब्रिगैंड 'वी'। –

उत्तर

6

यह एक backreference कहा जाता है, और आप \i का उपयोग पैटर्न से i'th कब्जा समूह का उल्लेख करने के।

तो पैटर्न ^((\s+)private\sfunction\s__construct\(\)) के लिए, प्रतिस्थापन \2def __init__ है।

+0

ठीक है, लेकिन यहां एक और उदाहरण है: ': s/^ ((\ s +) $ this ->)। * $/\ 2self। /'। जैसा कि आप देख सकते हैं, मैं '^ (\ s +) के लिए खोज रहा हूं ->। * $', है ना? लेकिन मैं केवल खोज पैटर्न के इस हिस्से को प्रतिस्थापित करना चाहता हूं: '\ s + this->'। तो, मैंने ब्रैकेट के दो सेट का उपयोग किया .... क्या मुझे '\ 2' या' \ 1' संदर्भित करना चाहिए? –

+0

कैप्चरिंग ब्रैकेट को बाएं से दाएं गिना जाता है, इसलिए उस उदाहरण के लिए \ 1'। चूंकि यह vi में है, इसलिए आपको नियमित अभिव्यक्ति के बिट्स से बचना होगा, @ प्रशांतभाट का जवाब देखें। या तो मैं सामान्य रेगेक्स वाक्यविन्यास का उपयोग करने के लिए vim में '\ v' ध्वज का उपयोग करता हूं, लेकिन मुझे यकीन नहीं है कि vi है या नहीं। –

12

मुझे लगता है आप

:s/^\(\s\+\)private function __construct()/\1def __init__/g 

अपने पैटर्न के लिए सबसे पहले

:s/^\(\s\+\)private function __construct()/\1def __init__/ 

कुछ सुझाव बदलें vi

में बदलने के लिए सभी घटनाओं की जगह चाहते

  • / खोज के लिए vi में प्रयोग किया जाता है, का उपयोग :
  • आप में vi
  • उपयोग \i जहां मैं दसवीं कैप्चर समूह \1\2 प्रतिस्थापन में वापस करने के लिए की तरह संदर्भ वर्गीकृत किया पैटर्न
  • \s नहीं किया जा सकता है () से बचने के लिए की जरूरत है प्रतिस्थापन टेक्स्ट में उपयोग ' ' बजाय
  • उपयोग /g अनुगामी यदि आप सभी को बदलना चाहते घटनाओं

http://vimregex.com आपको प्रारंभ करने में मदद करनी चाहिए।

+0

लेकिन यहां एक समस्या है .... अगर मेरे पास '{$ \ n \ r replaceme' है, तो मैं' {$ \ n \ r \ s + replaceme^'खोजना चाहता हूं, और मैं केवल 's को बदलना चाहता हूं + replaceme'। कारण मैं ऐसा करना चाहता हूं क्योंकि ऐसे समय होते हैं जब "प्रतिस्थापन" पहले से '{$ \ n \ r' से नहीं होता है, और मैं नहीं चाहता कि आदेश उन पर सक्रिय हो। तो, क्या मैं "प्रतिस्थापन" को केवल तभी बदल सकता हूं जब यह '{$ \ n \ r' से पहले हो, और उसी जगह के साथ मेरा प्रतिस्थापन शुरू करें? –

2

मुझे नहीं लगता कि कोई भी वास्तव में प्रश्न को समझता है। असल में, जिस तरह से मैं यह कर रहा हूं, निम्नानुसार है:

"यदि आप एक प्रतिस्थापन पैटर्न, पैटर्न ए को खोजना चाहते हैं, और इसे प्रतिस्थापन स्ट्रिंग के साथ प्रतिस्थापित करना चाहते हैं, पैटर्न I, केवल तभी पैटर्न के साथ शुरू होता है, पैटर्न बी, तो आपको प्रतिस्थापन स्ट्रिंग में पैटर्न बी को शामिल करने की आवश्यकता है, जैसे::/(पैटर्न बी) (पैटर्न ए)/(पैटर्न बी) (i)/g "।

यह थोड़ा सा शब्द है लेकिन पढ़ने योग्य है।

अतीत में, मुझे यकीन है कि किसी ने सोचा है, "यह pattern b को pattern b के साथ वास्तव में प्रतिस्थापित करने के लिए बहुत से संसाधनों को बचा सकता है। ऐसा करने के लिए यह अनावश्यक है।" शायद यह स्वचालित रूप से होता है। मुझे vi या किसी अन्य प्रोग्राम में ऐसा करने के लिए अंतर्निहित विधि नहीं मिली है। मुझे यकीन है कि मैं ऐसा करने के लिए एक स्क्रिप्ट लिख सकता हूं, हालांकि।