Todos los archivos que terminan con un sufijo sin usar la negación

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?

preguntado el 28 de agosto de 12 a las 12:08

Por curiosidad, ¿cuáles son esas limitaciones? -

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... :-( -

3 Respuestas

Por qué no:

^.*[^p]$|^.*[^m]p$|^.*[^b]mp$|^.*[^.]bmp$

?

http://regexr.com?31vg7

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

/^.+\.([^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

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 or haz tu propia pregunta.