C#与一个模式相交的两个字符串列表

问题描述 投票:2回答:2

我有两个这样的字符串列表:

var entities= new List<string>(){"101", "102", "103",}; 
var files= new List<string>(){"101_F05_20101001.csv", "102_F05_20101001.csv", "201_F05_20101001.csv", "202_F05_20101001.csv"};

我希望在这个模式后得到相交的结果:

ID_F05_YYYYMMDD.csv

ID应与实体列表中的一个或多个项匹配。

我写了以下代码:

var list = files
    .Where(x => entities.Any(y => x.Contains(y) && x.Substring(0, y.Length) == y))
    .ToList();

运行代码here

但我想知道是否可以使用像这样的正则表达式来改进:

var regex = new Regex(@"^(\d*)_F05_\d*\.csv$");

可能吗?

c# regex list intersection
2个回答
3
投票

你可以用

.Where(x => Regex.IsMatch(x, $@"^(?:{string.Join("|", entities)})_F05_\d*\.csv$"))

根据您当前的输入数据,正则表达式看起来像^(?:101|102|103)_F05_\d*\.csv$,它将匹配

  • ^ - 字符串的开头
  • (?:101|102|103) - 一个与101102103相匹配的非捕获组
  • _F05_ - 文字字符串
  • \d* - 0位或更多位数
  • \.csv - .csv字符串
  • $ - 字符串的结尾

请注意,如果它们是数字,则不需要正则表达式转义entities。否则,你需要使用string.Join("|", entities.Select(Regex.Escape))

C# code demo

var entities= new List<string>(){"101", "102", "103",}; 
var files= new List<string>(){"101_F05_20101001.csv", "102_F05_20101001.csv", "201_F05_20101001.csv", "202_F05_20101001.csv"};

var pat = $@"^(?:{string.Join("|", entities)})_F05_\d*\.csv$";

var list = files
        .Where(x => Regex.IsMatch(x, pat))
        .ToList();

foreach (var s in list) {
    Console.WriteLine(s);
}

输出:

101_F05_20101001.csv
102_F05_20101001.csv

1
投票

我选择使用更多的linq来解决它:

        var entities = new List<string>() { "101", "102", "103", };
        var files = new List<string>() { "101_F05_20101001.cvs", "102_F05_20101001.cvs", "201_F05_20101001.cvs", "202_F05_20101001.cvs" };
        var regex = new Regex(@"^(\d*)_F05_\d*\.cvs$");

        var result = entities.SelectMany(e => files.Select(f =>
        {
            var match = regex.Match(f);
            if (match.Success)
            {
                if (match.Groups.Count > 1)
                {
                    if (match.Groups[1].Value == e) return f;
                }
            }

            return "";
        })).Where(s => !String.IsNullOrEmpty(s));
© www.soinside.com 2019 - 2024. All rights reserved.