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

本文关键字:是什么 通配符 列表 用于 | 更新日期: 2023-09-27 17:56:29

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

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")工作.

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

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

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

对于 EndsWith 仅接受字符串文本。


每个 OPs 请求在单元测试中具有数据的实际模式:

string data = "0000-0000-0001/111_Age_3_20150518T0800-0400.txt";
Console.WriteLine (Regex.IsMatch(data, @"20150518T[^.]+'.txt")); // True

恕我直言 - 正则表达式

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

如果一个人编写一个模式,根据已知而不是未知的东西,它会使匹配变得容易得多。

我精心制作了锚定20150518T的图案,然后我知道下一个被称为文字时期.。所以我用所谓的[^.]+来制作未知,它说,吃掉(匹配)任何不是文字时期^的东西.,一个或多个(+)。

因此,学习一些正则表达式模式匹配的基础知识,将我上面的哲学与第二个哲学应用,以尽可能避免通配符(模棱两可的.*),并且发现它们可以在日常编码中有效地进行正则表达式模式匹配。恕我直言

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

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

如果您不熟悉正则表达式,请使用此函数将使用通配符的模式转换为正则表达式。

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

它很简单

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