2012-08-28 9 views
5

Sto tentando di trovare tutti i file tranne quelli che terminano con .bmp.Tutti i file che terminano con un suffisso senza utilizzare la negazione

A causa di alcuni vincoli non è possibile utilizzare la negazione (?:,! :) e i riferimenti (\ 1, ...).

Ho fatto un'espressione e funziona per la maggior parte delle stringhe:

^\w+\.([^b].*|b|b[^m].*|bm|bm[^p].*|bmp.+)$ 

Si abbina tutto ciò che non si esaurisce con bmp - tra cui test.txt, test.bmp.txt, ecc Ma in modo non sicuro, consente test.bi.bmp.

Qualche idea su come migliorare la regex in modo che corrisponda solo ai file non che termina con .bmp?

+0

Per curiosità, che cosa sono questi vincoli? –

+0

Esistono altre applicazioni che utilizzano il motore regex sul computer di destinazione e per alcuni motivi (di cui non sono completamente a conoscenza, ma suppongo che potrebbero essere correlati a prestazioni, compatibilità con qualcosa o velocità) il motore regex è compilato in modo specifico senza di esso ... :-( – Avenger

risposta

5

perché no:

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

?

http://regexr.com?31vg7

Un alternative è ^.*([^p]|[^m]p|[^b]mp|[^.]bmp)$ (più breve).

+0

Grazie, funziona perfettamente (e molto altro elegante di quello che ho scritto). Anche se esiste un ultimo nome file errato che passa l'espressione: test..bmp – Avenger

+0

@Daniel: C'è un bug in regexr con quell'espressione regolare quando il testo è sull'ultima riga di input ed è seguito da una riga vuota. Non so perché. Aprire una nuova riga dopo quella e digitare qualcos'altro, e vedere. – Benoit

+0

Grazie. Risolve completamente il mio problema e ho imparato molto dalla tua risposta! – Avenger

0

Non troppo elegante, ma funziona:

^.*([^b][^m][^p]|b[^m][^p]|[^b]m[^p]|[^b][^m]p|bm[^p]|[^b]mp)$ 
+1

Si suppone anche che le estensioni siano sempre lunghe 3 lettere: –

+0

No, presumo solo che .bmp sia lungo 3 lettere, anche le estensioni con più di 3 caratteri saranno uguali – Dmitry

+0

@Dmitry: ad esempio test.notabmp? Questo dovrebbe corrispondere alla tua espressione regolare, ma non credo che lo sia. –

1
/^.+\.([^b][^.]*|b|b[^m][^.]*|bm|bm[^p][^.]*|bmp[^.]+)$/ 

Basta fare in modo che il punto prima di 'bmp' è l'ultimo punto

+0

Non [^.] Nega semplicemente tutto? – Avenger

+0

@Daniel: No, i metacaratteri regex perdono il loro significato speciale all'interno di una classe di caratteri. –

+0

Ho pensato che fosse applicato solo in() ... Buono a sapersi! Grazie. Un ultimo problema - test..bmp passa. – Avenger

Problemi correlati