2012-08-07 13 views
15

मुझे लगता है कि यह एक बहुत ही सरल समाधान है, लेकिन मैं लगभग एक घंटे के लिए उत्तर खोजने की कोशिश कर रहा हूं और इसे समझने में प्रतीत नहीं होता।विम रेगेक्स

मैं जैसे एक मिल रहा है/विम में की जगह है कि संख्या है कि 103 के साथ शुरू और 123 ही चार अंक के बाद करने के लिए चार अंक होते हैं की एक श्रृंखला की जगह लेंगे करने के लिए, कोशिश कर रहा हूँ:

1033303

%s/103\d\{4}/123\0/g 
: - -> 1233303
1033213> 1233213

निकटतम मैं आया यह है

हालांकि इस पूरी संख्या \0 से मिलान किया जा रहा में परिणाम है, जैसे:

1033303 ->1231033303

आप कोई मदद

उत्तर

21

के लिए बहुत-बहुत धन्यवाद तुम बहुत करीब हैं

%s/103\(\d\{4}\)/123\1/g 

\( और \) के बीच पैटर्न एक उप-मैच है जिसे \1,द्वारा एक्सेस किया जा सकता है उपस्थिति के क्रम मेंआदि। अधिक जानकारी के लिए :help \( देखें।

2

एक कैप्चरिंग समूह का उपयोग करें:

%s/103\(\d\{4}\)/123\1/g 
1

इस प्रयास करें:

%s#103\(\d\{4}\)#123\1#g 
6

अब w/ओ कब्जा समूह!

:%s/103\ze\d\{4}/123/g 

\ze वहां मैच का अंत सेट करेगा। यह आपके लिए पूरे पैटर्न से मेल खाता है लेकिन केवल इसके एक हिस्से पर प्रतिस्थापन करता है।

:h /\ze 
:h /\zs 
+0

होगा। * \ Ze के बाद एक बार चाल को अनदेखा करने के बाद एक बार चाल चलने के बाद? – SergioAraujo

+0

हां, यह उसी पंक्ति पर अधिक मैचों को रोक देगा –

+0

यह यहां काम करता है: '% s, 103 \ ze। *, 123, g' बदलते डेलीमीटर (तेज़ प्रकार) और सभी बाद के वर्णों को'। * 'के साथ मिलान करना प्रतिस्थापन पर नजरअंदाज कर दिया जाएगा। – SergioAraujo