C# 如何筛选与模式匹配的字符串列表

C# 如何筛选与模式匹配的字符串列表,c#,pattern-matching,C#,Pattern Matching,我有一个字符串列表(实际上是文件名),我只想保留那些与筛选表达式匹配的字符串,如:\*\u 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"); fi

我有一个字符串列表(实际上是文件名),我只想保留那些与筛选表达式匹配的字符串,如:
\*\u 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();
List files=newlist();
添加(“MyFile1.csv”);
添加(“MyFile1_Test.txt”);
添加(“MyFile2.csv”);
添加(“MyFile2_Test.txt”);
添加(“MyFile3.csv”);
添加(“MyFile3_Test.txt”);
添加(“MyFile_Testtxttxt.txt”);
//定义一个过滤器
字符串过滤器=“*\u Test.txt”;
//使过滤器正则表达式安全
foreach(字符x在@“\+?|{[()^$.#”)中)
filter=filter.Replace(x.ToString(),@“\”+x.ToString());
filter=string.Format(“^{0}$”,filter.Replace(“*”,“*”);
//老派
List resultList1=files.FindAll(委托(字符串s){return Regex.IsMatch(s,filter,RegexOptions.IgnoreCase);});
//使用LINQ的版本
List resultList2=files.Where(x=>Regex.IsMatch(x,filter,RegexOptions.IgnoreCase)==true.ToList();
您试过LINQ吗:

List<string> resultList = files.Where(x => x.EndsWith("_Test.txt")).ToList();
List resultList=files.Where(x=>x.EndsWith(“_Test.txt”)).ToList();
或者,如果您正在某个旧版/旧版.NET版本(<3.5)上运行此功能:

List resultList=files.FindAll(委托(字符串s){
返回s.EndsWith(“_Test.txt”);
});

如果您的模式将很复杂,您可能需要为此使用正则表达式

您可以使用适当的正则表达式作为过滤器(例如,对于您的特定示例,它将是
newregex(@“^.*.\u Test\.txt$”)
,或者您可以应用转换算法

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

比如说

var myRegex=new Regex(@"^.*_Test\.txt$");
List<string> resultList=files.Where(myRegex.IsMatch).ToList();
然后,您还可以使用此方法使用类似于
“*Test*.txt”
的过滤器

但是,如果您使用此转换路径,则需要确保转义掉所有特殊的正则表达式字符,例如““beans@”。”(“beans@”)等

Edit——示例replace太简单了,因为它不转换。因此它会找到
“fish\u Textxtxt”
,所以至少转义

所以


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

List<string> keys = new List<string>();
//populate your list
var myregex = new Regex("^.+$");
List<string> matchlist = keys.Where(i=>myregex.IsMatch(i)).ToList();
List key=new List();
//填充您的列表
var myregex=newregex(“^.+$”);
List matchlist=keys.Where(i=>myregex.IsMatch(i)).ToList();

我希望过滤器灵活,这样我就可以使用*.*或*.t*或任意数量的组合。删除*不会得到部分匹配。Eeep,对我的答案进行一次更正,您需要将字符串。格式更改为
(“^{0}$”
,否则它会发现
“fish_Test.txtwible”
如果您想要更灵活但可能更复杂的东西,您可以在其中添加正则表达式。我希望有一种不使用正则表达式的快速方法,因为这总是会导致头痛。我可以使用LINQ,所以我会尝试一下,看看会发生什么。
var myRegex=new Regex(@"^.*_Test\.txt$");
List<string> resultList=files.Where(f => myRegex.IsMatch(f)).ToList();
List<string> resultList=files.FindAll(delegate(string s) { return myRegex.IsMatch(s);});
 var myFilter="*_Test.txt";
 var myRegex=new Regex("^" + myFilter.Replace("*",".*") +"$");
string myFilter="*_Test.txt";
foreach(char x in @"\+?|{[()^$.#") {
  myFilter = myFilter.Replace(x.ToString(),@"\"+x.ToString());
}
Regex myRegex=new Regex(string.Format("^{0}$",myFilter.Replace("*",".*")));
List<string> keys = new List<string>();
//populate your list
var myregex = new Regex("^.+$");
List<string> matchlist = keys.Where(i=>myregex.IsMatch(i)).ToList();