regulares regular reemplazar linea inicio expressions expresiones expresion ejemplos caracteres basicas regex vim alignment tabular

regex - regular - Cómo encontrar la tercera aparición de un patrón en una línea



regular expressions (4)

La expresión regular sería:

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

Entonces, si, por ejemplo, quiere cambiar el 3er ''foo'' a ''bar'' en la siguiente línea:

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

correr:

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

Llegar:

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

Hoy tuve que alinear una tabla solo en los primeros espacios múltiples en una línea.

Educación física

<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 complemento Tabular para alinear las tablas, pero no pude encontrar la manera de encontrar solo la primera aparición de espacios múltiples y hacer una alineación solo allí.

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?


No sé si se adapta a tus necesidades, pero puedes buscar de esa manera:

  1. Coloca el cursor en la línea de inicio
  2. Tipo 3 / pattern Regreso

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

También puedes macro:

q a + 3 nq

entonces @ a para ir a la siguiente línea tercera ocurrencia


Prueba esto:

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

Sí, Tabularize usa la expresión regular de Vim, así que el ejemplo en la respuesta de Eelvex debería funcionar.


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

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

Esto: (?:.*?foo) busca cualquier cosa seguida de ''foo'', luego se repite 3 veces (?:.*?foo){3} , luego se captura la cadena de inicio a (incluyendo) la 3ra repetición, luego, el resto de la cuerda se combina con .*$ , luego toda la cadena es reemplazada por una cosa capturada, y la longitud de la misma es la posición del último carácter de la 3ª ''foo''.