2013-10-03 51 views
0

首先,我要感謝任何花時間閱讀我的文章的人。REGEX匹配filenname約定

那麼,我是正則表達式世界的新手,我可以創建非常基本的REGEX,但現在我想跳轉到更復雜的一個。

目的是僅匹配那些文件名至極METS下一命名約定:

文件名應具有一定的炭組合開始,那麼它應該跟隨任意4個數字,然後下劃線。我不需要關心文件名的其餘部分。

有作爲文件名的開頭一定的有效組合,讓說:

ABCD 
HIJK 

是爲文件名的唯一有效起始字符串。

例如,下一個字符串是有效的:

ABCD9403_XXXXXXXXXXXX.XXX(因爲它與ABCD開頭,則4位數字,然後下劃線) HIJK6701_xXxXxX.xXx(因爲它與HIJK開頭,則4位數字,然後下劃線)

但是,接下來的那些無效:

AMCD6987_xxxxxx.xxx(因爲AMCD不匹配任何有效的起始串以上的:ABCD或HIJK)

HIJK12F2_xxxxxxx.xxx(它以一個有效的字符串(HIJK),但接下來的部分不包含4個數字(它包含一個F代替))

ABCD9547-21654sdasd321.321asd(它配襯的有效起始串和4個數字中的一個,但它不匹配下劃線。

我打算使用Java對其進行編碼。

我希望有人能幫助我。

所有的建議都被廣泛接受。

感謝大家。

+1

您是否試圖解決'正則表達式'。如果是,那麼你可以展示給我們。也讓我們知道你在哪裏面臨問題。 – Smit

+0

Hello @Smit。我試圖測試你們發給我的建議。我正在嘗試在線java測試人員,因爲我不在我的個人計算機上編寫代碼。但是,我無法使用此匹配,例如:http://java-regex-tester.appspot.com/ – JoseTlaseca

+0

它現在有效。我嘗試使用[link] http://myregextester.com/index.php並標記了Java複選框,它向我展示了內部生成的代碼的預覽,並且我注意到「\\」導致它不適用於我因爲它試圖與下一個模式匹配: 'code'Pattern。編譯(「^(ABCD | HIJK)\\\\ d {4} _」);'代碼' 所以我刪除了兩個「\」之一,它工作得很好。 所有的建議都適用於我的案例,不幸的是我不能將所有標記爲有效的,因此我決定將我的投票給予@barnesjd,讓他逐步解釋他的時間。 謝謝你們! – JoseTlaseca

回答

0

不建議任何錯誤與以前的答案。我想我會包括一個解釋它的評論。

Pattern p = Pattern.compile(
    "(?:"  + // Open a "non-capturing" group for our two letter sequences 
    "ABCD"  + // The sequence ABCD ... 
    "|"   + // OR ... 
    "HIJK"  + // the sequence HIJK 
    ")"   + // close the group 
    "\\d"  + // A digit ... 
    "{4}"  + // exactly 4 times 
    "_"   + // an underscore 
    ".*"   // Anything else. 
); 

assertTrue(p.matcher("ABCD9403_XXXXXXXXXXXX.XXX").matches()); 
assertTrue(p.matcher("HIJK6701_xXxXxX.xXx").matches()); 
assertFalse(p.matcher("AMCD6987_xxxxxx.xxx").matches()); 
assertFalse(p.matcher("HIJK12F2_xxxxxxx.xxx").matches()); 
assertFalse(p.matcher("ABCD9547-21654sdasd321.321asd").matches()); 
1

只是這樣的:

^(ABCD|HIJK)\\d{4}_