web-dev-qa-db-fra.com

Comment trouver la 3ème occurrence d'un motif sur une ligne

Aujourd'hui, je devais aligner une table à seulement les premiers multiples espaces sur une ligne.

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

J'utilise un plugin tabulaire pour aligner les tables, mais je n'ai pas pu trouver de manière à trouver uniquement la première occurrence de plusieurs espaces et d'aligner uniquement là-bas.

Je ne le sais pas non plus dans Vim: quelle sera la regex si je veux seulement trouver la 3ème occurrence d'un motif sur une ligne? La regex est-elle la même chose que d'utiliser tabulaire?

17
Reman

La regex serait:

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

Donc, si, par exemple, vous souhaitez modifier le 3ème 'FOO' à 'Bar' sur la ligne suivante:

lorem ifoopsum foo lor foor ipsum foo dolor foo
       ^1      ^2      ^3         ^4        ^5

cours:

s/\(.\{-}\zsfoo\)\{3}/bar/

obtenir:

lorem ifoopsum foo lor barr ipsum foo dolor foo
       ^1      ^2      ^3=bar     ^4        ^5
17
Eelvex

Pour les utilisateurs de Google (comme moi) qui recherchent juste pour: "Regex Nth Occurrence". Cela retournera la position du dernier caractère de la troisième "FOO" (vous devez changer {3} à votre n et foo à votre texte):

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

Cette: (?:.*?foo) recherche quelque chose suivi de 'foo', alors il est répété 3 fois (?:.*?foo){3}, puis la chaîne du début (y compris) la 3ème répétition est capturée, puis le reste de la chaîne est apparié par .*$, puis la chaîne entière est remplacée par une chose capturée et la longueur de celle-ci est la position du dernier caractère de la 3ème 'FOO ".

4
alexkovelsky

Je ne sais pas si cela correspond à vos besoins, mais vous pouvez rechercher de cette façon:

  1. Placez votre curseur à la ligne de début
  2. Taper 3/pattern Return

Il placer le curseur sur la 3ème occurrence de la prochaine ligne correspondante (mettant en évidence toutes les occurrences)

Vous pouvez aussi macro:

qa+3nq

alors @a aller à la ligne suivante 3ème occurrence

4
M'vy

Essaye ça:

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

Oui, tabulariser utilise la regex de Vim. L'exemple de la réponse de Eelvex devrait donc fonctionner.

1
Raimondi