2012-08-28 18 views
5

我試圖匹配除以.bmp結尾的所有文件。所有以不使用否定式結尾的文件

由於一些限制,我不能使用否定(?:,!:)和引用(\ 1,...)。

我做了一個表達式,它適用於大多數的字符串:

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

它匹配不.BMP結束一切 - 包括test.txt的,test.bmp.txt等但非常規的,它確實允許test.bi.bmp。

關於如何改進正則表達式的任何想法,所以它只會匹配文件而不是以.bmp結尾?

+0

出於好奇,那些是什麼限制? –

+0

還有其他應用程序在目標機器上使用正則表達式引擎,並且由於某些原因(我並不完全知道,但我猜它可能與性能,與某些事物的兼容性或速度有關),專門編譯了正則表達式引擎沒有它... :-( – Avenger

回答

5

爲什麼不:

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

http://regexr.com?31vg7

一種alternative^.*([^p]|[^m]p|[^b]mp|[^.]bmp)$(短)。

+0

謝謝,它可以很好地工作(還有更多比我寫的優雅)。 雖然有一個最後的錯誤文件名,做傳遞表達: test..bmp – Avenger

+0

@Daniel:有一個在與正則表達式regexr的錯誤時,文本是在最後輸入線和它後面是空行。我不知道爲什麼。在那之後打開一個新行並鍵入其他內容,然後查看。 – Benoit

+0

謝謝。它完全解決了我的問題,我從你的答案中學到了很多東西! – Avenger

0

不太優雅,但工作原理:

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

你也假定擴展名總是3個字母長 –

+0

我沒有,我只是假設.bmp是3個字母長,超過3個字符的擴展名也會匹配 – Dmitry

+0

@Dmitry:例如test.notabmp?這應該與你的正則表達式匹配,但我認爲它不是。 –

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

只是確保「BMP」前的點是最後一個點

+0

不是[^。]只是否定一切? – Avenger

+0

@Daniel:不,正則表達式元字符在字符類中失去其特殊含義。 –

+0

我以爲它只適用於()...很高興知道!謝謝。 最後一個問題 - test..bmp確實通過。 – Avenger

相關問題