LinqToObjects中的Regex和Like操作符

本文关键字:Like 操作符 Regex 中的 LinqToObjects | 更新日期: 2023-09-27 18:11:54

为了避免混淆,我谈论的是对对象的linq,而不是其他。我的工作与许多对象在内存中,我需要过滤它们。我们有一个有许多选项的屏幕,用户可以选择许多值。

我需要实现类似于sql中的"喜欢"操作符。我确实在这个网站上找到了一个关于它的帖子,并使用正则表达式,但我从未使用过它。我想知道我的字符串模式是否正确。不应该使用"%"%"吗?

我也读到你应该使用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);
}
任何建议

LinqToObjects中的Regex和Like操作符

如果你想检查一个字符串是否包含另一个字符串,你可以使用:

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*,搜索的文本是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));

或以

结尾
string pattern = string.Format("{0}$", Regex.Escape(criteria.SearchText));