我有两个这样的字符串列表:
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)
- 匹配101
、102
或103< 的非捕获组
_F05_
- 文字字符串\d*
- 0 个或多个数字\.csv
-.csv
字符串$
- 字符串结尾
请注意,如果实体是数字,则无需使用正则表达式转义实体。否则,您需要使用string.Join("|",Entity.Select(Regex.Escape))
。
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/