2012-06-01 53 views
1

我已經看到SO上的其他帖子,包括排除字符串的正則表達式匹配(使用負面展望/看後面),但我仍然很難得到它的工作。希望有人能幫忙。正則表達式文件名排除匹配

我有一個正則表達式

\.(gif|jpg|png)$ 

,我用它來匹配(GIF/JPG/PNG)

結尾的文件名,但是我想用排除列表,因此某些文件的名字不會匹配。

例如

非常感謝!

+0

要回顯@MarkRoberts - 爲什麼這必須作爲正則表達式來完成? –

+0

我正在使用的程序需要它的輸入有一個RegEx字符串用於文件匹配 – Lukie

回答

1

如果排除的數量少,您可以使用多個負的樣子,屁股像這樣:

(?<!\/foo)(?<!\/bar)(?<!www\.site\.com\/foobar)\.(gif|jpg|png)$ 

的「/」 foo和酒吧確保前的全名匹配foo或酒吧,它不只能在它結束。如果可能在文件名前沒有「/」,則需要調整此部分。

後視的一個缺點是您只能使用定義的長度,因此不允許使用*,+{1,5}。您必須自行指定每個例外。

請注意,環視並不會改變它所查看的字符串中的「位置」,這就是爲什麼您可以像這樣連接它們的原因。

+0

太棒了,我認爲這樣做可以完成這項工作。謝謝! – Lukie

2

您可以使用:

^(?!(foo|bar)\.(gif|jpg|png)$).*\.(gif|jpg|png)$ 

See it

+0

太棒了!..工作是否謝謝! – Lukie

+0

Appologies,剛剛意識到我需要一個URL作爲你的答案不適用的比賽的一部分。 – Lukie

1

我發現,想讀我的代碼6周後意味着它幾乎總是更好地從正則表達式分別應用過濾器這樣的。如果你稍稍饒一點perl:

# Apply original png/gif/jpg filter to get list of files 
my @files = qw/ 
    asdf.jpg 
    bar.png 
    fdsa.png 
    foo.gif 
    foo.jpg 
/; 

# Filter files to only those that don't look like ^<forbidden>\. 
@files = grep { 
    $_ !~ /^(foo|bar)\./ 
} @files; 

這也是人們傾向於將shell命令串在一起的原因。