C# 使用模式将两个字符串列表相交

标签 c# regex list intersection

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

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 => Regex.IsMatch(x, $@"^(?:{string.Join("|", entities)})_F05_\d*\.csv$"))

根据您当前的输入数据,正则表达式将类似于 ^(?:101|102|103)_F05_\d*\.csv$ 并且它将匹配

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

请注意,如果实体是数字,则无需使用正则表达式转义实体。否则,您需要使用string.Join("|",Entity.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

关于C# 使用模式将两个字符串列表相交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54928702/

相关文章:

java - 如何从二进制文件读取两种不同的列表类型

c# - 如何在按钮单击事件的模态弹出扩展程序中的 iframe 中加载页面?

c# - 使用 RightFax 在 C# 中获取 'System.AccessViolationException' 异常

regex - 使用 REGEX 查找包装内容中的换行符

php - .htaccess 重定向匹配。匹配除一个单词之外的字符串

python函数从列表中获取参数

c# - 在对象集合中访问和保存 XElement

c# - Windows 服务中的 SQL 连接

带有正则表达式过滤意外字符的 Python str.strip()

python - 如何在 python 中将两个列表组合成列表列表?