用于匹配列表中的值的通配符是什么
本文关键字:是什么 通配符 列表 用于 | 更新日期: 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"));