
Quiero encontrar una manera de mostrar todas las líneas que contienen cierto patrón, pero las líneas vecinas (anterior, siguiente) no.
por ejemplo: digamos que el patrón es la palabra "PATRÓN"
1.#########################
2.#########PATRÓN#########
3.##############################
entonces la segunda línea es válida y se muestra.
PERO
1.#########################
2.#########PATRÓN#########
3.#########PATRÓN#########
4.##############################
entonces la segunda y tercera líneas no son válidas, por lo tanto no se mostrarán
Respuesta1
Querrá utilizar grupos de captura de expresiones regulares, de la siguiente manera:
/\v%(PATTERN.*\n.*)@<!(PATTERN)%(.*\n.*\1)@!
Esto puede parecer aterrador, pero en realidad es bastante simple:
\v
se utiliza para habilitar"muy mágico"expresiones regulares (evita el uso de barras invertidas para la mayoría de los caracteres especiales)PATTERN.*\n.*
esPATTERN
, seguido de cualquier cosa, una nueva línea y cualquier otra cosa(...)@<!
es el patrón de la mirada atrás negativa: significa queno quiero¿Qué hay entre las llaves para existir? Entonces, en nuestro caso, todos los pasos2
no deberían existir.(PATTERN)
Esta es nuestra palabra real, ¡esto debería existir! Lo capturamos con llaves para uso futuro..*\n.*\1
es cualquier cosa, una nueva línea, cualquier cosa otra vez, y nuestro grupo capturado (ver paso4
)%(...)@!
es una anticipación negativa, como antes, no queremos que exista lo que hay entre llaves.
Básicamente, queremos PATTERN
, que es:
- no precedido por una línea que contenga
PATTERN
- no seguido por una línea que contiene
PATTERN