2008-12-15 48 views
1

我想建立在Java中,將在的FilenameFilter傳遞給在目錄中的文件篩選的正則表達式。的Java正則表達式的文件過濾

的問題是,我不能讓正則表達式「心型」 :)

這是我想出了選擇,我想排除的文件正則表達式的竅門

((ABC | XYZ))+ \ w * Test.xml

我想要做的是選擇所有以Test.xml結尾但不以ABC或XYZ開頭的文件。

能否請您補充,可以幫助我在我的戰鬥與正則表達式的任何資源。

感謝

下資源解釋了有關正則表達式regular-expressions.info

+2

現在你有兩個問題。 – 2008-12-15 20:56:23

回答

4

我想要做的是選擇 所有以Test.xml 結束,但不ABCXYZ啓動文件。

要麼你所有的文件匹配這個表達式:

^(?:(?:...)(?<!ABC|XYZ).*?)?Test\.xml$ 

,或者你卻反其道而行之,並採取一切,做匹配文件:

^(?:ABC|XYZ).*?Test\.xml$ 

就個人而言,我找到第二個選擇要簡單得多。

 
ABC_foo_Test.xml // #2 matches 
XYZ_foo_Test.xml // #2 matches 
ABCTest.xml  // #2 matches 
XYZTest.xml  // #2 matches 
DEF_foo_Test.xml // #1 matches 
DEFTest.xml  // #1 matches 
Test.xml   // #1 matches 
9

這東西更容易,更快捷,更沒有正則表達式的可讀性很多東西。

if (str.endsWith("Test.xml") && !str.startsWith("ABC")) 
1

只爲正則表達式的樂趣:

(?ms)^([^\r\n]{3}(?<!ABC|XYZ)[^\r\n]*?)?Test\.xml$ 

即使這不是最可讀的解決方案,應該工作,並會避免你定義自己的自定義文件過濾器。

(?<!ABC|XYZ)是向後看的表達,避免(前三個字符後)任何第四個字符由你想避免什麼之前。

+0

這對於「DEFTest.xml」或「Test.xml」不起作用。 – Tomalak 2008-12-15 10:16:02

+0

@Tomalak:謝謝,我只是修復了我的正則表達式和+1(儘管我更喜歡[\ r \ n]爲'。') – VonC 2008-12-15 11:17:46

+0

但是在這種情況下:文件名不能包含換行符。正常模式下點不匹配換行符,所以使用[^ \ r \ n]對我來說似乎有些過火 – Tomalak 2008-12-15 12:20:28

0

這將選擇不A,B,C,X,Y或Z開頭的文件,並在那的test.xml結束:

「[^ ABCXYZ] *測試\ \ .XML \\ Z」

  • [^ ABCXYZ]:任意字符不在集合A,B,C,X,Y,Z。
  • *:任意字符,零次或多次
  • 測試:確切的文字「測試」
  • \\ .:點字符(需要使用反斜線轉義,如果您在字符串中,則需要轉義該反斜線...一個反斜槓)
  • XML:確切的文本「XML」
  • \\ Z:輸入的結束
1

通過託默勒格和VonC提供的正則表達式是複雜得多,他們需要。在正則表達式的開頭放置一個負面的lookahead要比匹配三個字符和做一個負面的lookbehind要清晰得多。如果您使用matches()方法,則甚至不必使用錨(^$,\z)。

public boolean accept(File dir, String name) { 
    return name.matches("(?!ABC|XYZ).*Test\\.xml"); 
}