2017-03-02 6 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 
} 

2番目のリストで正規表現パターンを見つけて、最初のリストに一致するpaternが存在することを確認できます。

+0

のために動作します。どちらの場合も

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

は、これが出力されます?あなたは正規表現を行う方法を知らない?または? –

+0

2番目のリストで正規表現のパターンが最初のリストにあることを確認するために正規表現パターンを見つける方法を知りたかったのです – 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次のことができます。

AB_DBER_2016101194814.txt 
AB_EBER_2016101194815.txt 
AB_FBER_2016101194811.txt 
+1

私は私の答えを削除すると思う、私達は同じ方法でそれを解決した。 :-) – Sameer

+0

2番目のforeachを避けることは可能ですか?正規表現でない場合は、list.containsを使用して最初のfoeachで見つけることができますか? – blue

+0

@blue「普通の表現でないかのように...」とはどういう意味なのか分かりません。いずれにしても、LINQの代わりに2番目のループを「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); 
       } 
      } 
     } 
関連する問題