2015-07-03 43 views
2

我有一系列文件,我試圖解析文件名中的日期。下面是我目前試圖解析文件的例子:從文件名可變的文件中提取日期

AC SCR063_6.8.15.xlsx 
AC SCR064_6.22.15_REVISED.xlsx 
AccentCare July 2015 Rent Report 06.26.15 Final.xlsx 
AccentCare June 2015 Rent Report 05.26.15 Final.xlsx 

在這些文件中,日期很可能會一直處於DD.MM.YY或DD.MM.YYYY的格式。我試圖設計一個正則表達式匹配字符串中的這些日期而據我已經得到如:

^(\d{1,2})\.(\d{1,2})\.(\d{2,4})$ 

但由於在文件名中的多變性和我有限的正則表達式的知識,我不知道我需要做什麼才能使這個正則表達式匹配所有這些文件名稱的情況。我需要在正則表達式的日期部分之前創建一個可選捕獲組,以匹配處理它的任何事件以及之後的可選捕獲組,以排除Final.xlsx或_REVISED.xlsx等內容?

編輯:我也應該注意到這些文件名也會有字符串中的進行路徑信息,我會評估,雖然我相信我可以得到直接文件名的另一種方式,如果它會更容易評估字符串辦法。編輯2:期望的輸出將是6.8.15或06.26.15等,只是dd.mm.yy格式的日期部分。這樣我可以在我的應用程序中將它投射到日期時間。

+0

什麼是你想要的輸出? – hungndv

+0

@hungndv請看我編輯 – Delete

+0

Fyi,你的格式不是'dd.mm.yyyy.',而是'MM.dd.yyyy.' –

回答

2

所以允許的格式是M.d.yyyyM.d.yy(不dd.mm.yyyy的說明),我會用DateTime.TryParseExact。例如這個LINQ查詢:

var fileNames = new string[] { "AC SCR063_6.8.15.xlsx", "AC SCR064_6.22.15_REVISED.xlsx", "AccentCare July 2015 Rent Report 06.26.15 Final.xlsx", "AccentCare June 2015 Rent Report 05.26.15 Final.xlsx" }; 
string[] allowedFormats = { "M.d.yyyy", "M.d.yy" }; 
DateTime[] dates = fileNames 
    .Select(fn => Path.GetFileNameWithoutExtension(fn).Split(' ', '_')) 
    .Select(arr => arr.Select(s => s.TryGetDateTime(null, allowedFormats)) 
         .FirstOrDefault(dt => dt.HasValue)) 
    .Where(nullableDate => nullableDate.HasValue) 
    .Select(nullableDate => nullableDate.Value) 
    .ToArray(); 

使用這種方便的擴展方法來解析字符串DateTime?

public static DateTime? TryGetDateTime(this string item, DateTimeFormatInfo dfi, params string[] allowedFormats) 
{ 
    if (dfi == null) dfi = DateTimeFormatInfo.InvariantInfo; 
    DateTime dt; 
    bool success = DateTime.TryParseExact(item, allowedFormats, dfi, DateTimeStyles.None, out dt); 
    if (success) return dt; 
    return null; 
} 

結果是:

08.06.2015 00:00:00 System.DateTime 
22.06.2015 00:00:00 System.DateTime 
26.06.2015 00:00:00 System.DateTime 
26.05.2015 00:00:00 System.DateTime 
+0

我對格式的錯誤,但是這似乎工作得非常好。非常感謝你。 – Delete

2

這大致看起來是正確的,但你有一個開始行和行結束檢查你的正則表達式(^開頭和$結束)。

試試這個:(\ d {1,2})(\ d {1,2})(\ d {2,4})

+2

這個正則表達式也會匹配'1.2.123'的值。不確定是否有預期。 –

+0

但是,如果你有像這樣的行:「000a95.6.153a9 Final.xlsx」 – Fabjan

相關問題