2011-03-24 34 views
14

今天,我不得不只在一條線上的第一個多個空格處對齊表格。如何在一條線上找到第三次出現的圖案

p.e.

<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 

我用表格插件對準錶,但我不能找到一種方法如何發現只有多個空格中第一次出現,做一個只對準那裏。

我不知道它在VIM中: 如果我只想在一行中找到第三個模式,那麼正則表達式會是什麼? 正則表達式與使用Tabular相同嗎?

回答

12

正則表達式是:

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

所以,如果,例如,你想改變第3 '富' 到 '棒' 上以下行:

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時,只考慮最後一個。當然':help/\ zs'說明它。 – Benoit 2011-03-25 12:42:38

+0

謝謝Eelvex,我仍然有一個小問題。正則表達式在找到第三個'foo'後不會停止。這也將改變第六'富'和第九'富'。我怎樣才能阻止第三'富'後的正則表達式? – Reman 2011-03-25 15:57:52

+0

@Remonn:只需要在行首('^')開頭:'/^\(。\ { - } ...'但是這真的有必要嗎?':s'沒有'g'結尾只取代你的第三種模式的第一次出現。:) – Eelvex 2011-03-25 16:46:34

4

我不知道這是否符合您的需要,但你可以搜索方式:

  1. 將光標置於開始線
  2. 類型 /pattern返回

它將光標放在下一個匹配行的第三個匹配項上(突出顯示所有匹配項)

您也可以宏:

q一個+ňq

然後@一個去到下一行第3發生

+0

不完全是因爲它只在一行中搜索第三次出現,而在其他行中僅搜索第一次出現。 – Reman 2011-03-24 17:43:19

+0

你可以跳3 + 3與 n也。 – 2011-03-24 17:44:29

+0

也許用宏可以簡化這個過程。我想也有一條捷徑去到下一行的開始,但不記得它。 – 2011-03-24 17:45:42

1

試試這個:

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

是,Tabularize使用Vim的正則表達式,等等Eelvex的答案的例子應該工作。

+0

也感謝你的回答。 – Reman 2011-03-25 11:22:53

+0

當然這需要一個插件。 – Benoit 2011-03-25 12:42:01

2

對於只搜索「regex n occurrence」的Google用戶(與我一樣)。這將返回第三個「富」的最後一個字符的位置(您需要更改{3}nfoo到文本):

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

此:(?:.*?foo)搜索什麼,然後「富」,那麼它是重複3次(?:.*?foo){3},然後從開始到包括第3次重複的字符串被捕獲,然後字符串的其餘部分被.*$匹配,然後整個字符串被捕獲的東西替換,並且它的長度是第三'foo'的最後字符的位置。

+0

P.S.那些'vim'正則表達式,無論它們是什麼,看起來都很糟糕。 – alexkovelsky 2015-05-02 08:09:22

相關問題