簡體   English   中英

如何過濾與模式匹配的字符串列表

[英]How to filter a list of strings matching a pattern

我有一個字符串列表(實際上是文件名),我只想保留那些與過濾器表達式匹配的字符串,例如: \*_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。 如果你想要完整的 lamda,你會使用:

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"類的過濾器。

但是,如果您走這條轉換路線,則需要確保您轉義了所有特殊的正則表達式字符,例如“。” 變成@".", "(" 變成@"(" 等等......

編輯——示例替換太簡單了,因為它不轉換。 所以它會找到"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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM