用于匹配列表数组中字符串的通配符是什么?
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")
中使用。
答案 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"));