列表中匹配值的通配符是什么?

时间:2015-06-16 19:01:18

标签: c#

用于匹配列表数组中字符串的通配符是什么?

var myList = new List<string>();

myList.Add("0000-0000-0001/111_Age_3_20150518T0800-0400.txt");
myList.Add("0000-0000-0002/222_Bal_3_20120518T0800-0400.txt");
myList.Add("0000-0000-0003/333_DDS_3_20140518T0800-0400.txt");

var filteredFiles = myList.Where(x => x.EndsWith("*_20150518T*-*.txt")).ToList();

我尝试了通配符和&符号,但他们都没有工作。

我希望这可以在x.EndsWith("*_*_*_20150518T*-*.txt")中使用。

3 个答案:

答案 0 :(得分:9)

在where子句中使用正则表达式来处理复杂的匹配场景:

myList.Where(x => Regex.IsMatch(x, @"{Regex Pattern}")).ToList();

对于EndsWith,只接受字符串文字。

每个OP请求在单元测试中包含数据的实际模式:

string data = "0000-0000-0001/111_Age_3_20150518T0800-0400.txt";

Console.WriteLine (Regex.IsMatch(data, @"20150518T[^.]+\.txt")); // True

恕我直言 - 正则表达式

基本形式的正则表达式模式只是 literal 要查找的文本。

如果一个人针对编写一个模式,而这个模式已知,而不是未知,那么匹配就会变得更容易。

我制作了模式以锚定20150518T,然后我知道下一个被称为文字句号.。因此,我使用已知的[^.]+来制作未知,其中说,吃掉(匹配)任何非^字面句.,一个或多个(+ )。

所以学习一些正则表达式模式匹配的基础知识,将我的上述哲学应用于第二个,以尽可能避免使用通配符(ambigous .*),并且发现它们可以在当天有效地进行正则表达式模式匹配日编码。 IMHO

答案 1 :(得分:1)

基于Array.findAll()的解决方案:

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

如果您不熟悉Regex,请使用此功能将使用通配符的模式转换为Regex。

public string WildcardToRegex(string pattern)
{             
    string result= Regex.Escape(pattern).Replace(@"\*", ".+?").Replace(@"\?", "."); 
    if (result.EndsWith(".+?")) result = result.Remove(result.Length - 3,3)+".*";
    return result;
}

答案 2 :(得分:0)

简单

var filteredFiles = myList.Where(x => x.EndsWith(".txt"));