Si sólo se preocupan de que la cadena no termina con .jpg
o .png
, puede utilizar esto:
^.+$(?<!\.jpg)(?<!\.png)
El ^.+
no es estrictamente necesario, pero dependiendo de cómo el analizador JSON que se codifica podría necesitar forzar a la expresión regular a consumir toda la cadena. Si está utilizando la expresión regular para otras validaciones así, es posible que desee algo más elaborado, como:
^\w+(?:\.\w+)+$(?<!\.jpg)(?<!\.png)
Probablemente ha intentado usar (?<!\.jpg|\.png)
, lo que no funciona porque el sabor de expresiones regulares de Python es uno de los más restrictivo cuando se trata de mirar atrás. PHP y Ruby 1.9+ lo aceptarían porque cada una de las alternativas tiene una longitud fija. Ni siquiera tienen que ser la misma longitud ; (?<!\.jpg|\.jpeg|\.png)
funcionaría también. Simplemente no intente factorizar el punto, como en (?<!\.(?:jpg|jpeg|png))
; la alternancia tiene que estar en el nivel superior de la mirada hacia atrás.
Java aceptaría la versión factorizada, ya que hace un poco más de trabajo en tiempo de compilación para determinar el número máximo de caracteres que el lookbehind podría necesitar para coincidir. Sin embargo, la expresión lookbehind debe ser bastante simple y no puede usar los cuantificadores +
o *
. Finalmente, los sabores de .NET y JGSoft no imponen ninguna restricción en las búsquedas. Pero Python hace un intento muy simple de averiguar la cantidad exacta de caracteres que el aspecto subyacente necesita para coincidir, generando ese mensaje de error críptico cuando falla.
¡buen trabajo! excelente – yash