2012-10-24 64 views
2

我想通過目錄中的文件擴展名刪除文件。現在我的計劃只是選擇所有文件類型的過濾器「點星」,像這樣:選擇除一個擴展名外的所有文件

.* 

我現在需要它刪除,除了用名爲.abc文件擴展名的文件的所有文件。我將如何更改正則表達式過濾器來反映這一點?

+0

顯示您的代碼,或者很難說。 – xdazz

+0

謝謝大家的建議。我進行了徹底的測試,但我無法讓他們工作。我確實認爲這是我的程序問題,而不是您的代碼建議。 –

+0

邁克爾沒有提到這是一個在字段中使用正則表達式來選擇將要被刪除的文件的工具。邁克爾不能改變這個工具,因爲它不是他的。我也使用這個工具。該應用程序以.net編寫,並運行給定路徑中的文件,並刪除所有文件,例如臨時目錄中的所有文件。邁克爾希望該工具刪除除*之外的所有臨時文件,例如.out文件。 – Ian

回答

1

前瞻 向後看(假設你指的是支持的話):

^.*(?<!\.abc)$ 

對不起,您要查找的背後,不進取。

+0

其實,這不會起作用 – Bohemian

+0

@Bohemian:是的,抓住了它。臨近睡覺時間。 [現在應該工作。](http://regexr.com?32ij6);-) –

+0

這看起來是一個很好的解決方案。我剛剛在網上使用了一個網絡正規表達式評估器,使用下面的^。*(?<!\。out)(?<!\。log)$來試試這個,它似乎正確地匹配了我扔在它,除了.log和.out – Ian

0

您可以使用一個負的外觀後面,掛靠在輸入的結束,像這樣:

^.*(?<!\.abc)$ 

或者更簡單地使用負先行停泊開始輸入:

^(?!.*\.abc$) 
2

或者,最簡單地說:

(?i)\.abc$ 

甚至不需要一個奇特的正則表達式ENGIN e(與周圍的支持)來匹配那個。只是否定您的代碼中的匹配。如果匹配,請不要刪除它。如果沒有,請刪除它。

(?i)部分是可選的。它使正則表達式不區分大小寫(所以它會匹配file1.abcFILE2.ABC)。您可以使用Regex options達到相同的效果。

0

只是,我們也有一個「真正的」正則表達式的答覆:

(^.?.?.?|[^.]...|\.[^a]..|\..[^b].|\...[^c])$ 

但是你可以看到,這變得非常複雜,尤其是當你需要第二個擴展,所以你其實真的想用一些:-)

+0

我看不出這將如何工作。我甚至不能看到你在這裏做什麼。第二個替代('[^。] ...')* file.xaml *將失敗,這將錯誤地拒絕* file.acd *(只應拒絕* file.abc *)。 – JDB

+0

你沒有嘗試過,是嗎?以下是它的工作方式:第一個選項處理3個或更少字符的字符串。其他四個字符串的構造方式使得這四個字符串中只有* none *的字符串是字符串「.abc」。例如,'.axc'匹配'\ .. [^ b] .'和'-abc'匹配'[^。] ...' - 因爲它們是ORed,就足夠了。只有'.abc'不能匹配其中的任何一個,因爲對於所有的替代方案,它在'[^ x]'的位置上具有禁止的字符。 – Marian

+0

啊...我現在看到它。我的錯。談論難以維護。 :) – JDB

0

其他解決方案試試這個簡單的regex

^.*(?=[.]abc$) 

解釋:

^ 比賽必須在字符串或行的開頭開始。

(?= subexpression) 零寬度陽性預測先行斷言。

[ character_group ] 匹配character_group任何單個字符。

$ 的匹配必須在該行或字符串的結尾在所述字符串的末尾或前\ñ發生。

相關問題