使用正则表达式模式查找列表中是否存在项目

时间:2017-03-02 00:34:41

标签: c# regex list

我有一个附有时间戳的文件列表。我还有另一个包含正则表达式模式的列表。我想验证&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
 }

我想知道如何在第二个列表中找到正则表达式模式,以验证第一个列表中是否存在匹配的patern。

2 个答案:

答案 0 :(得分: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 :(得分: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);
                }
            }
        }