【问题标题】:C# intersect two list of strings with a patternC# 将两个字符串列表与一个模式相交
【发布时间】:2019-02-28 15:08:52
【问题描述】:

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

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$");

有可能吗?

【问题讨论】:

  • .Where(x =&gt; Regex.IsMatch(x, $@"^(?:{string.Join("|", entities)})_F05_\d*\.csv$"))?
  • @WiktorStribiżew 它不起作用,找不到匹配项
  • 顺便说一句,csvcvs?您的输入数据包含cvs,但您在模式中尝试了csv
  • csv 格式,将修复
  • 它正在工作!文件格式错误

标签: c# regex list intersection


【解决方案1】:

你可以使用

.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

【讨论】:

    【解决方案2】:

    我选择多用一点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));
    

    【讨论】:

    • 哪个是正则表达式模式?请把它包括在内吗?
    • 我只是用了你的 :-)(除了错字(csv -> cvs)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多