2017-03-02 40 views
3

我有一個附加了時間戳的文件列表。我還有另一個包含正則表達式模式的列表。我想驗證'文件'中'refFiles'的所有模式是否存在。使用正則表達式模式查找列表中是否存在一個項目

下面是示例文件,

List<string> files = new List<string>(); 
files.Add("AB_DBER_2016101194814.txt"); 
files.Add("AB_EBER_2016101194815.txt"); 
files.Add("AB_FBER_2016101194811.txt"); 

這是參考圖樣:

List<string> refFiles = new List<string>(); 
refFiles.Add("AB_DBER_[0-9]{13,13}.txt"); 
refFiles.Add("AB_EBER_[0-9]{13,13}.txt"); 
refFiles.Add("AB_FBER_[0-9]{13,13}.txt"); 

我想要做的是這樣的:

foreach (var file in refFiles) 
{ 
    //if file has a match in files then I need to do some code 
} 

我想知道我是怎麼可以在第二個列表中找到正則表達式來驗證匹配的模板是否存在於第一個列表中。

+0

究竟問題出?你不知道如何做正則表達式?要麼? –

+0

我想知道如何在第二個列表中找到正則表達式來驗證匹配的模板是否存在於第一個列表 – blue

+1

'[0-9] {13,13}'=>'[0-9] {13}' =>'\ d {13}' – pinkfloydx33

回答

5

下面是一個通用的方法,與其中的you can fiddle here

請注意對您的正則表達式的更改。它使用\.而不是.字符串@;這將匹配instead of the wildcard character class

using System; 
using System.Collections.Generic; 
using System.Text.RegularExpressions; 

public class Program 
{ 
    public static void Main() 
    { 
     List<string> files = new List<string>(); 
     files.Add("AB_DBER_2016101194814.txt"); 
     files.Add("AB_EBER_2016101194815.txt"); 
     files.Add("AB_FBER_2016101194811.txt"); 

     // the following will not match 
     files.Add("AB_FBER_20161011948111txt"); 
     files.Add("This_Does_Not_Match.txt"); 

     List<string> refFiles = new List<string>(); 
     refFiles.Add(@"AB_DBER_[0-9]{13,13}\.txt"); 
     refFiles.Add(@"AB_EBER_[0-9]{13,13}\.txt"); 
     refFiles.Add(@"AB_FBER_[0-9]{13,13}\.txt"); 
     foreach (var pattern in refFiles) 
     { 
      var regex = new Regex(pattern); 
      foreach (var file in files) 
      { 
       if (regex.IsMatch(file)) 
       { 
        Console.WriteLine(file); 
       } 
      } 
     } 
    } 
} 

use LINQ可以:

foreach (var file in files) 
{ 
    if (refFiles.Any(pattern => Regex.IsMatch(file, pattern))) 
    { 
     Console.WriteLine(file); 
    } 
} 

在這兩種情況下,這是輸出:

AB_DBER_2016101194814.txt 
AB_EBER_2016101194815.txt 
AB_FBER_2016101194811.txt 
+1

我想我會刪除我的答案,我們用相同的方式解決它。 :-) – Sameer

+0

是否有可能避免第二個foreach?就像如果它不是正則表達式那麼我可以在第一個使用list.contains的工具中找到它? – blue

+0

@blue我不知道你是什麼意思,「如果它不是正則表達式......」在任何情況下,我添加了LINQ的替代方法,它隱藏了第二個循環在「Any」中。 –

1

此代碼對我的作品

 var files = new List<string> 
     { 
      "AB_DBER_2016101194814.txt", 
      "AB_EBER_2016101194815.txt", 
      "AB_FBER_2016101194811.txt" 
     }; 

     var refFiles = new List<string> 
     { 
      "AB_DBER_[0-9]{13,13}.txt", 
      "AB_EBER_[0-9]{13,13}.txt", 
      "AB_FBER_[0-9]{13,13}.txt" 
     }; 

     foreach (var patternFile in refFiles) 
     { 
      var regularExp = new Regex(patternFile); 
      foreach (var file in files) 
      { 
       if (regularExp.IsMatch(file)) 
       { 
        Console.WriteLine(file); 
       } 
      } 
     } 
相關問題