LinqToObjects中的Regex和Like运算符

时间:2011-10-19 07:43:24

标签: c# regex linq-to-objects

为了避免混淆,我正在谈论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);
}

任何建议

1 个答案:

答案 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));