Как найти 3-е вхождение шаблона на линии

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

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: Каким будет регулярное выражение, если я хочу только найти третье вхождение шаблона в строке? Является ли регулярное выражение таким же, как с помощью Tabular?

Ответ 1

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

/\(.\{-}\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

Ответ 2

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

  • Поместите курсор в начало строки
  • Тип 3 / pattern Return

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

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

q a + 3 n q

затем @ a, чтобы перейти к следующей строке. 3-е вхождение

Ответ 3

Для пользователей Google (таких как я), которые ищут только для: "regex nth появление". Это вернет позицию последнего символа третьего "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'.

Ответ 4

Попробуйте следующее:

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

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