17

今天我不得不在一行的前多个空格处对齐表格。

体育

<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

我使用 Tabular 插件来对齐表格,但我找不到如何只找到多个空格的第一次出现并仅在那里进行对齐的方法。

我在 VIM 中也不知道:如果我只想在一行上找到第 3 次出现的模式,那么正则表达式会是什么?正则表达式与使用表格相同吗?

4

4 回答 4

19

正则表达式将是:

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

因此,例如,如果您想在以下行中将第三个“foo”更改为“bar”:

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
于 2011-03-24T19:57:48.500 回答
5

我不知道它是否符合您的需求,但您可以这样搜索:

  1. 将光标放在起始行
  2. 类型3 / pattern Return

它将光标放在下一个匹配行的第三次出现(突出显示所有出现)

您还可以宏:

qa+3nq

然后@a转到下一行第 3 次出现

于 2011-03-24T17:36:06.857 回答
4

对于只搜索“正则表达式第 n 次出现”的 Google 用户(如我)。这将返回第三个 'foo' 的最后一个字符的位置(您需要更改{3}为您的nfoo您的文本):

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

这:(?:.*?foo)搜索后面跟着 'foo' 的任何东西,然后重复 3 次(?:.*?foo){3},然后捕获从 start 到(包括)第 3 次重复的字符串,然后字符串的其余部分由 匹配.*$,然后整个字符串被捕获的东西替换,并且长度其中是第三个'foo'的最后一个字符的位置。

于 2015-05-02T08:07:50.480 回答
1

试试这个:

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

是的,Tabularize 使用 Vim 的正则表达式,所以 Eelvex 的答案示例应该有效。

于 2011-03-24T20:33:06.710 回答