2009-10-21 51 views
11

Tôi có một ứng dụng cần tìm và xử lý các tệp theo một quy ước đặt tên rất cụ thể như sau.C# - Regex - So khớp tên tệp theo mẫu đặt tên cụ thể

IABC_12345-0_YYYYMMDD_YYYYMMDD_HHMMSS.zip 

Tôi không thể làm được điều này bằng cách sử dụng mẫu tìm kiếm để tôi tạo danh sách tệp bằng mẫu ký tự đại diện đơn giản hơn.

RegEx re = new RegEx("blah"); 

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

Đây có phải là cách tốt nhất để làm điều này và nếu có, làm cách nào để tạo biểu thức chính quy cho phù hợp với định dạng tệp này?

Trả lời

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

Đối với một biểu thức chính quy đơn giản mà cũng sẽ phù hợp với thông số kỹ thuật thời gian không hợp lệ (tức là giờ = 73 vv.), Bạn có thể sử dụng một cái gì đó như thế này:

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

Nó phụ thuộc vào cách thức cụ thể mà bạn muốn để phù hợp với những tên. Điều này có đủ cụ thể không:

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

?

Giải thích:

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' 

Nhưng, nếu bạn có tập tin có tên chứa ngày không hợp lệ hoặc thời gian, nó có thể không thực tế được thực hiện với regex một mình, đặc biệt là nếu phần DATE_DATE mà bạn chỉ định một phạm vi ngày. Bạn sẽ phải phù hợp với tất cả các tên tập tin như tôi (và những người khác) đã cho bạn thấy, và sau đó thực hiện một số "thường xuyên" lập trình logic để lọc ra những cái không hợp lệ.

0

RegexBuddy là một cách tuyệt vời để chi tiêu một vài đô la (nếu bạn có một số chi tiêu). Nó sẽ giúp bạn phát triển, kiểm tra và gỡ lỗi các regex của bạn. Nó thậm chí tạo ra đoạn mã cho bạn.

RegexMagic (từ cùng một tác giả) thậm chí có thể giúp bạn nhiều hơn: Nó giúp bạn tạo mẫu regex từ mẫu. (Tôi đã không thử nó mặc dù vậy tôi không thể nói nếu nó tốt).