Regex para cadena que no termina con el sufijo dado

No he podido encontrar una expresión regular adecuada para unir cualquier cadena que no termine con alguna condición. Por ejemplo, no quiero hacer coincidir nada que termine con una a .

Este partido

 b ab 1 

Esto no coincide

 a ba 

Sé que la expresión regular debería estar terminando con $ para marcar el final, aunque no sé qué debería precederla.

Editar : La pregunta original no parece ser un ejemplo legítimo para mi caso. Entonces: ¿cómo manejar más de un personaje? ¿Decir algo que no termine con ab ?

Pude arreglar esto, usando este hilo :

 .*(?:(?!ab).).$ 

Aunque la desventaja de esto es que no coincide con una cadena de un personaje.

No nos da el idioma, pero si su soporte de sabor regex mira hacia atrás , esto es lo que necesita:

 .*(?< !a)$ 

(?< !a) es una afirmación negar look-behind que asegura que antes del final de la cadena (o fila con el modificador m ), no existe el carácter "a".

Véalo aquí en Regexr

También puede extender esto fácilmente con otros caracteres, ya que esta comprobación de la cadena y no es una clase de caracteres.

 .*(?< !ab)$ 

Esto coincidiría con cualquier cosa que no termine con "ab", véalo en Regexr

Use el símbolo no ( ^ ):

 .*[^a]$ 

Si coloca el símbolo ^ al comienzo de los corchetes, significa “todo excepto las cosas entre paréntesis”. $ es simplemente un ancla para el final.

Para múltiples personajes , simplemente ponlos todos en su propio conjunto de caracteres:

 .*[^a][^b]$ 

Para buscar archivos que no terminan en “.tmp” utilizamos la siguiente expresión regular:

 ^(?!.*[.]tmp$).*$ 

Probado con el Regex Tester da el siguiente resultado:

enter image description here

 .*[^a]$ 

la expresión regular anterior coincidirá con cadenas que no termina con a .

Prueba esto

 /.*[^a]$/ 

El [] denota una clase de caracteres, y el ^ invierte la clase de caracteres para que coincida con todo menos un a .

Cualquier cosa que coincida con algo que termine con un — .*a$ Entonces cuando coincida con la expresión regular, anule la condición o alternativamente también puede hacer .*[^a]$ donde [^a] significa algo que not a es not a

La pregunta es antigua, pero no pude encontrar una mejor solución. Publiqué la mía aquí. Busque todas las unidades USB pero no enumere las particiones , eliminando así la “parte [0-9]” de los resultados. Terminé haciendo dos grep, el último niega el resultado:

 ls -1 /dev/disk/by-path/* | grep -P "\-usb\-" | grep -vE "part[0-9]*$" 

Esto resulta en mi sistema:

 pci-0000:00:0b.0-usb-0:1:1.0-scsi-0:0:0:0 

Si solo quiero las particiones que podría hacer:

 ls -1 /dev/disk/by-path/* | grep -P "\-usb\-" | grep -E "part[0-9]*$" 

Donde obtengo:

 pci-0000:00:0b.0-usb-0:1:1.0-scsi-0:0:0:0-part1 pci-0000:00:0b.0-usb-0:1:1.0-scsi-0:0:0:0-part2 

Y cuando lo haga:

 readlink -f /dev/disk/by-path/pci-0000:00:0b.0-usb-0:1:1.0-scsi-0:0:0:0 

Yo obtengo:

 /dev/sdb 

La respuesta aceptada está bien si puede usar soluciones alternativas. Sin embargo, también hay otro enfoque para resolver este problema.

Si miramos la expresión regular ampliamente propuesta para esta pregunta:

.*[^a]$

Descubriremos que casi funciona. No acepta una cadena vacía, lo que podría ser un poco inconviniente. Sin embargo, este es un problema menor cuando se trata solo de un personaje. Sin embargo, si queremos excluir una cadena completa, por ejemplo, “abc”, entonces:

.*[^a][^b][^c]$

no va a hacer No aceptará ac, por ejemplo.

Sin embargo, hay una solución fácil para este problema. Simplemente podemos decir:

.{,2}$|.*[^a][^b][^c]$

o versión más generalizada:

.{,n-1}$|.*[^firstchar][^secondchar]$ donde n es la longitud de la cadena que desea prohibir (para abc es 3), y firstchar , secondchar , … son primero, segundo. .. enésimo caracteres de tu cuerda (para abc sería a , luego b , luego c ).

Esto proviene de una simple observación de que una cadena que es más corta que el texto que no prohibiremos no puede contener este texto por definición. Entonces podemos aceptar cualquier cosa que sea más corta (“ab” no es “abc”), o cualquier cosa lo suficientemente larga como para que podamos aceptarla, pero sin el final.

Aquí hay un ejemplo de búsqueda que eliminará todos los archivos que no son .jpg:

find . -regex '.{,3}$|.*[^.][^j][^p][^g]$' -delete