当输入基本字符时,如何搜索带有变音符号的列表
本文关键字:搜索 音符 列表 符号 输入 字符 何搜索 | 更新日期: 2023-09-27 18:16:36
我正在为Windows Phone 8.1编写一个使用VS Express 2013和c#的小应用程序:
使用AutoSuggestBox工具,我希望用户的输入与字符串列表进行比较,但是列表中的字符串包含重音字符,如"*,*,*",我想向用户显示甚至包含"*"的结果,当他输入"c"。我该怎么做呢?
What I have:
var resultList = SuggestionsList.Where(s => s.Contains(suggestions.Text));
suggestions.ItemsSource = resultList;
其中"建议列表"是字符串的原始列表,"建议"是自动建议框的名称。
谢谢。
使用RegEx。所以,如果你的用户搜索"cat",你可以搜索类似"[cje]at"的东西。只有一些英文字母有重音变体,因此您可以创建这些字母的静态列表,并根据输入轻松构建RegEx。
另一种技术上更合理的方法在这篇文章中已经讨论过了。
RegEx例子
假设你的输入字符串是"cat",你想搜索字母"c"的所有变体。作为第一步,您将使用一个简单的循环构造RegEx:
string MyRegEx = "";
for(int i=0; i<input.Length; i++)
{
switch(input[i])
{
case 'a':
MyRegEx += [aâà];
break;
case 'c':
MyRegEx += [cč];
break;
....
default: //for letters that do not have any accented variants
MyRegEx += input[i];
break;
}
}
System.Text.RegularExpressions.RegEx R = new System.Text.RegularExpressions.RegEx(MyRegEx);
var Your Results = SuggestionsList.Where(s => R.IsMatch(s.ToLower()));
您需要与无字符版本的字符串进行比较,您可以通过使用Unicode字符串库(在c#中可用)中称为规范化(string . normalize)的特性来实现这一点。FormD规范化将一个复合字符分成"基字符"和特征字符。
您可以使用以下代码片段使用规范化从字符中剥离一个变音符号:
string formDString = txt.Normalize(NormalizationForm.FormD);
var sb = new StringBuilder();
var len = formDString.Length;
for (int i = 0; i < len; i++)
{
var formDChar = formDString[i];
System.Globalization.UnicodeCategory category = System.Globalization.CharUnicodeInfo.GetUnicodeCategory(formDChar);
if (category != System.Globalization.UnicodeCategory.NonSpacingMark)
{
sb.Append(formDChar);
}
}