为了避免混淆,我正在谈论linq对象而不是别的。 我在内存中处理很多对象,我需要过滤它们。 我们有一个包含许多选项的屏幕,用户可以选择多个值。
我需要在sql中实现类似于“Like”运算符的东西。 我确实在这个网站上找到了一篇关于它的帖子并使用了正则表达式,但我从未使用它。 我想知道我的字符串模式是否正确。不应该使用“%”“%”?
我还读到你应该使用startWith -endWith和contains的组合,但是我没有找到任何使用它们的所有组合的例子,只是为了感觉如何去做。
我这样做
string pattern = string.Format(".*{0}.*", criteria.SearchText);
myList= myList.Where(x => x.Message.Like(pattern)).ToList();
public static bool Like(this string s, string pattern, RegexOptions options = RegexOptions.IgnoreCase)
{
return Regex.IsMatch(s, pattern, options);
}
任何建议
答案 0 :(得分:5)
如果要检查字符串是否包含另一个字符串,可以使用:
myList = myList.Where(x => x.Message.Contains(criteria.SearchText)).ToList();
或
myList = myList.Where(x => x.Message.IndexOf(criteria.SearchText) != -1).ToList();
(第二个变体很好,因为使用IndexOf
您可以指定CultureInfo
)
如果要在Regex
中混合用户定义的单词,则应使用Regex.Escape()
对其进行转义,以便在用户写入a*
时,搜索到的文本为{ {1}}代替a*
。
any number of a
但请注意,如上所述,它相当于:
string pattern = string.Format(".*{0}.*", Regex.Escape(criteria.SearchText));
因为您没有将锚点放到正则表达式中,因此将在字符串中的任何位置搜索正则表达式。
如果要锚定用户定义的单词,例如,您要搜索以
开头的单词string pattern = string.Format("{0}", Regex.Escape(criteria.SearchText));
或以
结尾string pattern = string.Format("^{0}", Regex.Escape(criteria.SearchText));