2011-03-24 17 views
14

Hoy tuve que alinear una tabla solo en los primeros espacios múltiples en una línea.Cómo encontrar la tercera aparición de un patrón en una línea

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 

utilizo el plugin tabular para alinear las tablas pero no pude encontrar una manera de cómo encontrar sólo la primera aparición de múltiples espacios y hacer una alineación sólo allí.

Yo tampoco lo sé en VIM: ¿Cuál será la expresión regular si solo quiero encontrar la tercera aparición de un patrón en una línea? ¿Es la expresión regular lo mismo que usar Tabular?

Respuesta

12

La expresión regular sería:

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

Así que si, por ejemplo, desea cambiar el tercero 'foo' a 'bar' en la siguiente línea:

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

de ejecución:

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

para obtener:

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

Muy buen uso de '\ zs' dentro de un '\ (... \)' bloque. No sabía que al repetir zs, solo se tuvo en cuenta el último. Por supuesto ': help/\ zs' lo dice. – Benoit

+0

Gracias Eelvex, todavía tengo un pequeño problema. La expresión regular no se detiene después de haber encontrado el 3 ° 'foo'. Cambiará también el 6 ° 'foo' y el 9 ° 'foo'. ¿Cómo puedo detener la expresión regular después de la tercera 'foo'? – Reman

+0

@Remonn: simplemente solicite el inicio de la línea ('^') al principio: '/^\ (. \ {-} ...' pero ¿es esto realmente necesario? ': S' sin' g' al final solo reemplace la primera ocurrencia de su tercer patrón :) :) – Eelvex

4

No sé si se ajusta a sus necesidades, pero se puede buscar de esa manera:

  1. Coloque el cursor en la línea de inicio
  2. Tipo /patternVolver

Coloca el cursor en la tercera aparición de la siguiente línea coincidente (resaltando todas las apariciones)

Puede también macro:

qun+nq

continuación @un para ir a la siguiente línea 3 ocurrencia

+0

no exactamente porque solo busca en una línea la tercera aparición y en otras líneas la primera vez. – Reman

+0

Puede saltar 3 por 3 con n también. –

+0

Tal vez con una macro puede simplificar el proceso. Supongo que también hay un atajo para ir al comienzo de la siguiente línea, pero no lo recuerdo. –

1

Prueba esto:

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

Sí, en forma de tabla utiliza expresiones regulares de Vim, por lo que el ejemplo de la respuesta de Eelvex debería funcionar.

+0

gracias también por su respuesta. – Reman

+0

Por supuesto, se necesita un complemento para esto. – Benoit

2

Para usuarios de Google (como yo) que solo buscan: "regex nth occurrence".Esto posición del último carácter del tercer 'foo' volver (es necesario cambiar {3} a su n y foo a su texto):

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

Este: (?:.*?foo) búsquedas para nada seguido de 'foo', entonces es repite 3 veces (?:.*?foo){3}, luego cadena de inicio a (incluyendo) 3ra repetición es capturada, el resto de la cadena es emparejado por .*$, luego toda la cadena es reemplazada por cosa capturada, y la longitud es la última del tercer carácter 'foo' .

+0

P.S. esas expresiones 'vim', sean lo que sean, se ven horribles. – alexkovelsky

Cuestiones relacionadas