Todos los archivos que terminan con un sufijo sin usar la negación
Frecuentes
Visto 325 veces
5
Estoy tratando de hacer coincidir todos los archivos excepto los que terminan en .bmp.
Debido a algunas restricciones, no puedo usar la negación (?:,! :) y las referencias (\1, ...).
Hice una expresión y funciona para la mayoría de las cadenas:
^\w+\.([^b].*|b|b[^m].*|bm|bm[^p].*|bmp.+)$
Coincide con todo lo que no termina con .bmp, incluidos test.txt, test.bmp.txt, etc. Pero, lamentablemente, permite test.bi.bmp.
Cualquier idea sobre cómo mejorar la expresión regular para que solo coincida con los archivos no terminando en .bmp?
3 Respuestas
5
Por qué no:
^.*[^p]$|^.*[^m]p$|^.*[^b]mp$|^.*[^.]bmp$
?
An alternativa is ^.*([^p]|[^m]p|[^b]mp|[^.]bmp)$
(corto).
Respondido 28 ago 12, 12:08
Gracias, funciona perfectamente (y mucho más elegante que lo que escribí). Aunque hay un último nombre de archivo incorrecto que pasa la expresión: test..bmp - Vengador
@Daniel: hay un error en regexr con esa expresión regular cuando el texto está en la última línea de entrada y es seguido por una línea en blanco. no sé por qué Abra una nueva línea después de esa y escriba cualquier otra cosa, y vea. - Benoit
Gracias. ¡Resuelve completamente mi problema y he aprendido mucho de tu respuesta! - Vengador
1
/^.+\.([^b][^.]*|b|b[^m][^.]*|bm|bm[^p][^.]*|bmp[^.]+)$/
solo asegúrese de que el punto antes de 'bmp' sea el último punto
Respondido 28 ago 12, 12:08
¿No [^.] simplemente niega todo? - Vengador
@Daniel: No, los metacaracteres de expresiones regulares pierden su significado especial dentro de una clase de carácter. - Tim Pietzcker
Pensé que solo se aplicaba en ()... ¡Es bueno saberlo! Gracias. Un último problema: test..bmp pasa. - Vengador
0
No demasiado elegante pero funciona:
^.*([^b][^m][^p]|b[^m][^p]|[^b]m[^p]|[^b][^m]p|bm[^p]|[^b]mp)$
Respondido 28 ago 12, 12:08
También está asumiendo que las extensiones siempre tienen 3 letras. - Simón Nickerson
No lo hago, solo asumo que .bmp tiene 3 letras. Las extensiones que tengan más de 3 caracteres también coincidirán. - Dmitry
@Dmitry: por ejemplo test.notabmp? Esto debería coincidir con su expresión regular, pero no creo que lo sea. - Simón Nickerson
test.bsp tampoco coincide... ¿tal vez b[^m]p debería agregarse a la cláusula OR? - Vengador
Además, todavía coincide con cualquier cosa.bmp... creo que es porque * es codicioso - Gabber
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas regex regex-negation or haz tu propia pregunta.
Por curiosidad, ¿cuáles son esas limitaciones? - Serge Wautier
Hay otras aplicaciones que usan el motor de expresiones regulares en la máquina de destino y debido a algunas razones (de las cuales no soy completamente consciente, pero supongo que podría estar relacionado con el rendimiento, la compatibilidad con algo o la velocidad) el motor de expresiones regulares se compila específicamente sin eso... :-( - Avenger