2011-03-24 17 views
14

पर किसी पैटर्न की तीसरी घटना को कैसे ढूंढें आज मुझे लाइन पर केवल पहले एकाधिक रिक्त स्थान पर एक तालिका को संरेखित करना पड़ा।लाइन

पेज।

<ScrollWheelDown> move window  three lines  down 
<S-ScrollWheelDown>  move window one page down 
<ScrollWheelUp>  move window  three lines up 
<S-ScrollWheelUp> move window one page  up 

मैं तालिका प्लगइन का उपयोग टेबल संरेखित करने के लिए, लेकिन मैं एक तरह से कैसे कई रिक्त स्थान की केवल पहली घटना को खोजने के लिए नहीं पा सके और केवल वहाँ एक संरेखित है।

मैं इसे या तो वीआईएम में नहीं जानता: यदि मैं केवल एक पंक्ति पर पैटर्न की तीसरी घटना को ढूंढना चाहता हूं तो रेगेक्स क्या होगा? क्या रेगेक्स टैब्यूलर का उपयोग करने जैसा ही है?

उत्तर

12

regex होगा:

/\(.\{-}\zsPATTERN\)\{3} 

तो अगर, उदाहरण के लिए, आप 3 निम्न पंक्ति पर 'बार' के लिए 'foo' बदलना चाहते हैं:

lorem ifoopsum foo lor foor ipsum foo dolor foo 
     ^1  ^2  ^3   ^4  ^5 

रन:

s/\(.\{-}\zsfoo\)\{3}/bar/ 

पाने के लिए:

lorem ifoopsum foo lor barr ipsum foo dolor foo 
     ^1  ^2  ^3=bar  ^4  ^5 
+1

'\ zs' के अंदर बहुत अच्छा उपयोग '\ (... \)' ब्लॉक। मुझे नहीं पता था कि जेड दोहराते समय, केवल अंतिम व्यक्ति को ध्यान में रखा गया था। बेशक ': मदद/\ zs' यह बताता है। – Benoit

+0

धन्यवाद Eelvex, मुझे अभी भी एक छोटी सी समस्या है। तीसरा 'foo' पाया जाने के बाद रेगेक्स रुकता नहीं है। यह 6 वें 'फू' और 9वीं 'फू' भी बदल देगा। मैं तीसरे 'foo' के बाद regex कैसे रोक सकता हूँ? – Reman

+0

@Remonn: बस शुरुआत में लाइन ('^') की शुरुआत का अनुरोध करें: '/^\ (। \ {-} ... 'लेकिन क्या यह वास्तव में जरूरी है?' S' अंत में 'g' के बिना केवल अपने तीसरे पैटर्न की पहली घटना को प्रतिस्थापित करें। :) – Eelvex

4

अगर यह अपनी आवश्यकताओं फिट बैठता है मैं नहीं जानता, लेकिन आप इस तरह से खोज सकते हैं:

  1. प्लेस शुरुआत लाइन पर अपने कर्सर
  2. प्रकार /patternवापसी

यह कर्सर को अगली मिलान रेखा की तीसरी घटना पर रखता है (सभी घटनाओं को हाइलाइट करना)

तुम भी मैक्रो कर सकते हैं:

क्षएक+nक्ष

तो @एक अगली पंक्ति 3 पर जाने के लिए अवसर

+0

बिल्कुल ठीक नहीं है क्योंकि यह केवल एक पंक्ति में तीसरी घटना में और अन्य पंक्तियों में पहली घटना की खोज करता है। – Reman

+0

आप एन के साथ 3 से 3 तक कूद सकते हैं। –

+0

शायद मैक्रो के साथ आप प्रक्रिया को सरल बना सकते हैं। मुझे लगता है कि अगली पंक्ति की शुरुआत में जाने के लिए एक शॉर्टकट भी है लेकिन इसे याद नहीं है। –

1

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

:Tabularize /^.\{-}\S\s\{2,} 

हाँ, Tabularize विम के regex का उपयोग करता है, तो Eelvex के जवाब पर उदाहरण के काम करना चाहिए।

+0

आपके उत्तर के लिए भी आपको धन्यवाद। – Reman

+0

बेशक इसके लिए एक प्लग-इन की आवश्यकता है। – Benoit

2

Google उपयोगकर्ताओं (जैसे मुझे) के लिए जो केवल खोजता है: "regex nth घटना"।यह वापस आ जाएगी तीसरे 'foo' का अंतिम वर्ण की स्थिति (आप अपने पाठ करने के लिए अपने n और foo को {3} बदलने की जरूरत है):

length(regexp_replace('lorem ifoopsum foo lor foor1 ipsum foo dolor foo', '((?:.*?foo){3}).*$', '\1')) 

यह: 'foo' के बाद कुछ भी (?:.*?foo) खोज करता है, तो यह है 3 बार (?:.*?foo){3} दोहराया गया, फिर प्रारंभिक (सहित) तीसरे पुनरावृत्ति से स्ट्रिंग कैप्चर की जाती है, फिर शेष स्ट्रिंग .*$ से मेल खाती है, फिर पूरी स्ट्रिंग को कैप्चर की गई चीज़ से बदल दिया जाता है, और इसकी लंबाई तीसरी 'foo' के अंतिम चरित्र की स्थिति होती है। ।

+0

पीएस वे 'विम' regexes, जो भी वे हैं, भयानक लग रहे हो। – alexkovelsky