包含

时间:2015-06-30 20:09:23

标签: c# regex

我正在尝试在我的应用中创建搜索。我最初使用.Contains但后来意识到,如果我用户输入,比方说“s”,它将返回任何带有“s”的内容。所以然后我切换到.StartsWith但问题是,如果我有“瓶装水”并搜索“水”,它将无法显示。如果我输入以下任何一项,有没有办法可以写出一个可以得到“瓶水”的正则表达式:“瓶子”,“瓶子”,“水”,“水”“瓶装水”,“ “?

我原本想过用初学者进行初始搜索,然后分割字符串并搜索它并将它们合并到.Distinct以获取唯一记录,但我想如果我可以使用正则表达式' d好多了。

编辑: 这是我现在的代码

`if (txtSearch.Text != string.Empty)
                    {
                        if (txtSearch.Text.Trim().Length != 0)
                        {
                            dataSource = dataSource.Where(p => p.Name.ToLower().StartsWith(txtSearch.Text.ToLower().Trim())).ToList();
                        }
                    }`

2 个答案:

答案 0 :(得分:2)

技巧是\b字边界锚。

var searchString = "Bottle of Water";

var regex = new Regex(@"\bBottle of Water"); //or @"\bof", or @"\bWater", or @"\bof Water"
var match = regex.Match(searchString);

然后检查match.Success以确定您是否匹配。

\bWater表示匹配任何" Water"之前是一个单词边界(通常是空格,但可能是其他形式的标点符号)。

修改

.Net正则表达式默认区分大小写。如果您希望正则表达式不区分大小写,请提供RegexOptions.IgnoreCase或使用?i option。如果您只希望某些部分不区分大小写,则?i选项很有用:

var searchString = "Bottle of Water";

var regex = new Regex(@"\bbottle of water", RegexOptions.IgnoreCase); //or @"\bof", or @"\bwater", or @"\bof water"
var regex2 = new Regex(@"(?i:\bBOTTLE of) Water"); //"Bottle of" is case-insensitive, "Water" is case sensitive.
var match = regex.Match(searchString);
var match2 = regex2.Match(searchString);

答案 1 :(得分:1)

您需要决定搜索的内容。现在你有一些只能在一次搜索中解决的要求(至少据我所知)。如果用户输入一个字母,您只想检查字符串是否以该字母开头。如果有多个字符,则要在整个字符串中搜索该字词。

如果这是您想要的行为,则必须检查搜索字符串长度并对搜索字符串长度执行相应的查询。这样做具有明确且易于阅读的额外好处。