LinqToObjects 中的正则表达式和 Like 运算符

发布于 2024-12-10 10:59:37 字数 622 浏览 1 评论 0原文

为了避免混淆,我只讨论 linq to object,仅此而已。 我正在处理内存中的大量对象,我需要过滤它们。 我们有一个带有许多选项的屏幕,用户可以在其中选择许多值。

我需要实现类似于 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);
}

任何建议

Just to avoid confusion I am talking about linq to object and nothing else.
I am working with lots objects in memory and I need to filter them.
we have a screen with lots of options where a user can select many values.

I need to implement something similar to the "Like" operator in sql.
I did found a post about it in this site and uses regex but I have never used it.
I want to know if my string pattern is correct.Should not use "%" "%"?

I have also read that you should use a combination of startWith -endWith and contains,but I have not found any examples that uses all the them combined,just to get a feel how to do it.

I do something like this

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);
}

Any suggestions

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

玩物 2024-12-17 10:59:37

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

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* 任意数量的 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));

If you want to check if a string contains another you can use:

myList = myList.Where(x => x.Message.Contains(criteria.SearchText)).ToList();

or

myList = myList.Where(x => x.Message.IndexOf(criteria.SearchText) != -1).ToList();

(the second variant is good because with IndexOf you can specify the CultureInfo)

If you want to mix a user-defined word in a Regex you should use the Regex.Escape() to escape it, so that if the user writes a*, the searched text is a* instead of any number of a.

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

But note that as written, it's equivalent to:

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

because you haven't put anchors to your regex, so the regex will be searched anywhere in the string.

If you want to anchor the user-defined word, so for example you want to search for words that begin with

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

or end with

string pattern = string.Format("{0}$", Regex.Escape(criteria.SearchText));
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文