gpt4 book ai didi

c# - 如何过滤与模式匹配的字符串列表

转载 作者:行者123 更新时间:2023-12-03 13:19:02 28 4
gpt4 key购买 nike

我有一个字符串列表(实际上是文件名),我只想保留那些与过滤器表达式匹配的字符串,例如: \*_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。如果您希望完整的λ,请使用:
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"这样的过滤器。

但是,如果您采用了这种转换方法,则需要确保您转义了所有特殊的正则表达式字符,例如“。”变成@“。”,“(”变成@“(”等........

编辑-示例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("*",".*")));

关于c# - 如何过滤与模式匹配的字符串列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7013461/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com