如何过滤匹配模式的字符串列表

本文关键字:模式 字符串 列表 何过滤 过滤 | 更新日期: 2023-09-27 18:05:12

我有一个字符串列表(实际上是文件名),我想只保留那些匹配过滤器表达式的列表,如: '*_Test.txt

实现这一目标的最佳方法是什么?

这是我想到的答案:

List<string> files = new List<string>();
files.Add("MyFile1.csv");
files.Add("MyFile1_Test.txt");
files.Add("MyFile2.csv");
files.Add("MyFile2_Test.txt");
files.Add("MyFile3.csv");
files.Add("MyFile3_Test.txt");
files.Add("MyFile_Testtxttxt.txt");
// Define a filter
string filter = "*_Test.txt";
// Make the filter regex safe
foreach (char x in @"'+?|{[()^$.#")
    filter = filter.Replace(x.ToString(), @"'" + x.ToString());
filter = string.Format("^{0}$",filter.Replace("*", ".*"));
// Old School
List<string> resultList1 = files.FindAll(delegate(string s) { return Regex.IsMatch(s, filter, RegexOptions.IgnoreCase); });
// Version using LINQ
List<string> resultList2 = files.Where(x =>  Regex.IsMatch(x, filter, RegexOptions.IgnoreCase) == true ).ToList();

如何过滤匹配模式的字符串列表

如果你的模式比较复杂,你可能需要使用正则表达式....

你可以使用一个合适的正则表达式作为你的过滤器(例如,对于你的具体例子,它将是new Regex(@"^.*_Test'.txt$"),或者你可以应用一个转换算法。

无论哪种方式,你都可以使用linq来应用正则表达式。

例如

var myRegex=new Regex(@"^.*_Test'.txt$");
List<string> resultList=files.Where(myRegex.IsMatch).ToList();

有些人可能认为上面的答案是不正确的,但是你可以使用一个方法组来代替lambda。如果你想要完整的lambda,你可以使用:

var myRegex=new Regex(@"^.*_Test'.txt$");
List<string> resultList=files.Where(f => myRegex.IsMatch(f)).ToList();

或非Linq

List<string> resultList=files.FindAll(delegate(string s) { return myRegex.IsMatch(s);});

如果你要转换过滤器,一个简单的转换将是

 var myFilter="*_Test.txt";
 var myRegex=new Regex("^" + myFilter.Replace("*",".*") +"$");

你也可以用这个方法得到像"*Test*.txt"这样的过滤器。

但是,如果您使用这种转换路线,则需要确保转义出所有特殊的正则表达式字符,例如:"。"变成@"。","("变成@"("等等.......

Edit——示例replace太简单了,因为它不转换。所以它会找到"fish_Textxtxt"所以至少逃掉.

string myFilter="*_Test.txt";
foreach(char x in @"'+?|{[()^$.#") {
  myFilter = myFilter.Replace(x.ToString(),@"'"+x.ToString());
}
Regex myRegex=new Regex(string.Format("^{0}$",myFilter.Replace("*",".*")));

您试过LINQ:

List<string> resultList = files.Where(x => x.EndsWith("_Test.txt")).ToList();

或者如果你在一些旧的/遗留的。net版本(<3.5):

List<string> resultList = files.FindAll(delegate(string s) { 
    return s.EndsWith("_Test.txt"); 
});

这对我来说很有效,而且相当简单:

List<string> keys = new List<string>();
//populate your list
var myregex = new Regex("^.+$");
List<string> matchlist = keys.Where(i=>myregex.IsMatch(i)).ToList();