如何在一行上找到第三次出现的模式

时间:2011-03-24 17:15:58

标签: regex vim alignment tabular

今天我只需要在一行的第一个多个空格处对齐一个表。

体育专业。

<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中也不知道: 如果我只想在一条线上找到第三次出现的模式,那么正则表达式是什么? 正则表达式与使用Tabular相同吗?

4 个答案:

答案 0 :(得分:15)

正则表达式将是:

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

因此,例如,如果您想在下一行将第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

答案 1 :(得分:4)

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

  1. 将光标放在开头
  2. 输入 3 / pattern 返回
  3. 将光标放在下一个匹配行的第3个匹配项上(突出显示所有匹配项)

    你也可以宏:

    q + 3 名词 q

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

答案 2 :(得分:4)

对于Google用户(像我一样)只搜索:“regex nth occurrence”。这将返回第三个'foo'的最后一个字符的位置(您需要将{3}更改为n并将foo更改为您的文字):

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

这个:(?:.*?foo)搜索后跟'foo'的任何内容,然后重复3次(?:.*?foo){3},然后捕获从开始到(包括)第3次重复的字符串,然后匹配其余的字符串通过.*$,然后整个字符串被捕获的东西替换,它的长度是第3个'foo'的最后一个字符的位置。

答案 3 :(得分:1)

试试这个:

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

是的,Tabularize使用Vim的正则表达式,因此Eelvex答案的例子应该有效。