您好,我有一个名称类型对象的集合,我想对它执行一个通配符搜索。例如,如果我提供了一个搜索条件*ABC,那么返回的名称应该以ABC开头。如果我提供了一个搜索条件ABC*,那么返回的名称应该以ABC结尾。如果我提供了一个搜索条件*ABC*,那么返回的名称应该包含ABC。如果我提供了一个搜索条件?ABC,那么返回名称的第二、第三和第四个字符应该分别是ABC,而第一个字符可以是任何字符。
发布于 2010-06-23 22:18:28
下面是您可能使用的扩展方法
public static class EnumerableExtensions
{
public static IEnumerable<T> MatchesWildcard<T>(this IEnumerable<T> sequence, Func<T,string> expression, string pattern)
{
var regEx = WildcardToRegex(pattern);
return sequence.Where(item => Regex.IsMatch(expression(item), regEx));
}
public static string WildcardToRegex(string pattern)
{
return "^" + Regex.Escape(pattern).
Replace("\\*", ".*").
Replace("\\?", ".") + "$";
}
}使用方法如下:
void Main()
{
var items = new[] { new MyObj { MyProperty = "ABC123" },
new MyObj { MyProperty = "123ABC" },
new MyObj { MyProperty = "123ABC456" },
};
var matches = items.MatchesWildcard(item => item.MyProperty, "???ABC");
}
public class MyObj
{
public string MyProperty {get;set;}
}(WildcardToRegex摘自CodeProject)
发布于 2010-06-23 22:15:53
我认为你需要Regex.Escape和Regex.IsMatch()。
private IEnumerable<Item> FilterList(IEnumerable<Item> list, string query)
{
string pattern = QueryToRegex(query);
return list.Where(i => Regex.IsMatch(i.Name, pattern, RegexOptions.Singleline));
}
private static string QueryToRegex(string query)
{
return "^" + Regex.Escape(query).Replace("\\*", ".*").Replace("\\?", ".") + "$";
}注意:Samuel Jack's answer更好,因为他的正则表达式更好,所以可耻地在这里修复了它。
发布于 2010-06-23 22:04:46
我认为你需要使用.Contains,.StartWith,.EndsWith
https://stackoverflow.com/questions/3102250
复制相似问题