2009-10-21 34 views
11

我有一個應用程序需要找到並處理遵循如下特定命名約定的文件。C# - 正則表達式 - 根據特定命名模式匹配文件名

IABC_12345-0_YYYYMMDD_YYYYMMDD_HHMMSS.zip 

我不能看到這樣使用搜索模式,使林假設生病了我已經產生了使用簡單的通配符模式的文件列表後,做這樣的事情的任何簡單的方法。

RegEx re = new RegEx("blah"); 

foreach(FileInfo fi in Directory.GetFiles(path, "I*.zip")) 
{ 
    if(re.IsMatch(fi.Name)) 
     //blah blah blah 
} 

這是這樣做的最好方法,如果是這樣,我將如何形成正則表達式來匹配此文件格式?

回答

14
string pattern = @"I[A-Z]{3}_\d{5}-\d_\d{8}_\d{8}_\d{6}\.zip"; 
    var matches = Directory.GetFiles(@"c:\temp") 
     .Where(path => Regex.Match(path, pattern).Success); 

    foreach (string file in matches) 
     Console.WriteLine(file); // do something 
2

對於一個簡單的正則表達式,也將匹配無效的時間規格(即小時= 73等。),你可以使用這樣的事情:

^I[A-Z]{3}_\d{5}-\d_\d{8}_\d{8}_\d{6}\.zip$ 
7

這取決於你想具體怎麼匹配那些名。這是否足夠具體:

I[A-Z]{3}_\d{5}-\d_\d{8}_\d{8}_\d{6}\.zip 

說明:

I    // match an 'I' 
[A-Z]{3}  // followed by three upper case letters 
_    // followed by an underscore 
\d{5}   // followed by five digits 
-    // followed by a hyphen 
\d   // followed by a single digit 
_    // followed by an underscore 
\d{8}   // followed by eight digits 
_    // followed by an underscore 
\d{8}   // followed by eight digits 
_    // followed by an underscore 
\d{6}   // followed by six digits 
\.zip   // followed by '.zip' 

但是,如果你有文件的名稱中包含無效的日期或時間,它實際上是不能用正則表達式獨自完成,特別是如果你DATE_DATE部分指定的日期範圍。你必須匹配像I(和其他人)向你展示的所有文件名,然後執行一些「常規」編程邏輯來過濾出無效的文件名。

0

RegexBuddy是一個很好的方式花幾塊錢(如果你有一些花費)。它將幫助您開發,測試和調試您的正則表達式。它甚至爲你創建代碼片段。

RegexMagic(來自同一作者)可能甚至會幫助您更多:它可以幫助您從樣本創建正則表達式模式。 (我還沒有嘗試過,所以我不能說它是否好)。