Как найти 3-е вхождение шаблона на линии - PullRequest
17 голосов
/ 24 марта 2011

Сегодня мне пришлось выровнять таблицу только по первым нескольким пробелам в строке.

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

Я использую плагин Tabular для выравнивания таблиц, но не смог найти способ найти только первое вхождение нескольких пробелов и выполнить выравнивание только там.

Я тоже не знаю этого в VIM: Каким будет регулярное выражение, если я только хочу найти 3-е вхождение шаблона в строке? Является ли регулярное выражение таким же, как при использовании Tabular?

Ответы [ 4 ]

16 голосов
/ 24 марта 2011

Регулярное выражение будет:

/\(.\{-}\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
4 голосов
/ 02 мая 2015

Для пользователей Google (таких как я), которые ищут только: "регулярное выражение nth вхождение".Это вернет позицию последнего символа третьего 'foo' (вам нужно изменить {3} на ваш n и foo на ваш текст):

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

This: (?:.*?foo) ищетвсе, что следует за 'foo', затем повторяется 3 раза (?:.*?foo){3}, затем захватывается строка от начала до (включая) 3-го повторения, затем остаток строки соответствует .*$, затем вся строка заменяется захваченнойи длина его - позиция последнего символа 3-го 'foo'.

4 голосов
/ 24 марта 2011

Я не знаю, соответствует ли это вашим потребностям, но вы можете искать таким образом:

  1. Поместите курсор в начало строки
  2. Тип 3 / pattern Возврат

Помещает курсор на 3-е вхождение следующей совпадающей строки (выделяя все вхождения)

Вы также можете макрос:

д * * а тысяча двадцать две + * ** 1026 тысяча двадцать-пять * 3 * 1 027 ** +1028 * п * 1 029 * д * ** 1032 тысячу тридцать-один * затем @ a для перехода на следующую строку 3-й случай

1 голос
/ 24 марта 2011

Попробуйте:

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

Да, Tabularize использует регулярное выражение Vim, поэтому пример ответа Eelvex должен сработать.

...