我有两个这样的字符串列表:
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$");
有可能吗?
答案 0 :(得分:3)
您可以使用
.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
字符串$
-字符串结尾请注意,如果它们是数字,则不需要对entities
进行正则表达式转义。否则,您需要使用string.Join("|", entities.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
答案 1 :(得分: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));