Saltar al contenido

Expresión regular para hacer coincidir una línea que no contiene una palabra

Este team de especialistas luego de días de investigación y recopilación de de información, obtuvimos la respuesta, deseamos que te sea de gran utilidad para tu plan.

La noción de que regex no admite la coincidencia inversa no es del todo true. Puede imitar este comportamiento mediante el uso de miradas negativas:

^((?!hede).)*$

La expresión regular anterior coincidirá con cualquier string, o línea sin salto de línea, no que contiene el (sub)string ‘hede’. Como se mencionó, esto no es algo en lo que regex sea “bueno” (o debería serlo), pero aún así, es posible.

Y si también necesita hacer coincidir los caracteres de salto de línea, use el modificador DOT-ALL (el final s en el siguiente patrón):

/^((?!hede).)*$/s

o usarlo en línea:

/(?s)^((?!hede).)*$/

(donde el /.../ son los delimitadores de expresiones regulares, es decir, no forman parte del patrón)

Si el modificador DOT-ALL no está disponible, puede imitar el mismo comportamiento con la clase de personaje [sS]:

/^((?!hede)[sS])*$/

Explicación

A string es solo una lista de n caracteres. Antes y después de cada carácter, hay un vacío string. Entonces una lista de n los personajes tendrán n+1 cadenas vacías. Considera el string "ABhedeCD":

    ┌──┬───┬──┬───┬──┬───┬──┬───┬──┬───┬──┬───┬──┬───┬──┬───┬──┐
S = │e1│ A │e2│ B │e3│ h │e4│ e │e5│ d │e6│ e │e7│ C │e8│ D │e9│
    └──┴───┴──┴───┴──┴───┴──┴───┴──┴───┴──┴───┴──┴───┴──┴───┴──┘

index    0      1      2      3      4      5      6      7

donde el e‘s son las cadenas vacías. la expresión regular (?!hede). mira hacia adelante para ver si no hay subcadena "hede" para ser visto, y si ese es el caso (para que se vea algo más), entonces el . (punto) coincidirá con cualquier carácter excepto un salto de línea. Los vistazos también se denominan aserciones de ancho cero porque ellos no consumir cualquier personaje. Solo afirman/validan algo.

Entonces, en mi ejemplo, cada vacío string primero se valida para ver si no hay "hede" adelante, antes de que un personaje sea consumido por el . (punto). la expresión regular (?!hede). lo hará solo una vez, por lo que se envuelve en un grupo y se repite cero o más veces: ((?!hede).)*. Finalmente, el inicio y el final de la entrada están anclados para asegurarse de que se consuma toda la entrada: ^((?!hede).)*$

Como puede ver, la entrada "ABhedeCD" fallará porque en e3, la expresión regular (?!hede) falla (ahí es"hede" ¡más adelante!).

Tenga en cuenta que la solución a no Empezar con “hede”:

^(?!hede).*$

es generalmente mucho más eficiente que la solución a no Contiene “hede”:

^((?!hede).)*$

El primero verifica “hede” solo en la entrada stringla primera posición de , en lugar de en todas las posiciones.

Si solo lo estás usando para grep, puedes usar grep -v hede para obtener todas las líneas que no contienen hede.

ETA Ah, releyendo la pregunta, grep -v es probablemente lo que quiso decir con “opciones de herramientas”.

Reseñas y valoraciones

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags :

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *