我正在尝试在我的应用中创建搜索。我最初使用.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();
}
}`
答案 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)
您需要决定搜索的内容。现在你有一些只能在一次搜索中解决的要求(至少据我所知)。如果用户输入一个字母,您只想检查字符串是否以该字母开头。如果有多个字符,则要在整个字符串中搜索该字词。
如果这是您想要的行为,则必须检查搜索字符串长度并对搜索字符串长度执行相应的查询。这样做具有明确且易于阅读的额外好处。