我使用Reqex进行模式搜索。我使用了csv数据,但数据与csv中的句柄匹配。我选择SQLite作为数据库。我需要进行模式搜索才能只提取这些数据。是否可以使用sqlite查询?
string filter = key.Replace("u", "(u|ü)").Replace("a", "(a|ä)").Replace("o", "(o|ö)").Replace("s", "s|ß").Replace("ss", "(ss|ß)");
var myregex = new Regex(@"\b" + filter);
更新
我的数据库中有不同的值:
在这两种情况下,如果用户搜索“Muhle”,我也必须找到“Mühle”。我使用上面的正则表达式模式搜索并且运行良好,但现在我必须与sql查询相同。
答案 0 :(得分:1)
您可以调整过滤器并在SQL查询中使用它:
string filter = key.Replace("u", "[uü]").Replace("a", "[aä]").Replace("o", "[oö]").Replace("s", "[sß]");
var SQLQuery = @"SELECT * FROM * WHERE key="+filter;
答案 1 :(得分:0)
执行此操作的一种方法是注册自定义排序规则...这可以让您入门(完全未经测试!):
[SQLiteFunction(FuncType = FunctionType.Collation, Name = "NORMALIZEDCI")]
public class SQLiteNormalizedComparer : SQLiteFunction
{
private static string RemoveDiacritics(string text)
{
var normalizedString = text.Normalize(NormalizationForm.FormD);
var stringBuilder = new StringBuilder();
foreach (var c in normalizedString)
{
var unicodeCategory = CharUnicodeInfo.GetUnicodeCategory(c);
if (unicodeCategory != UnicodeCategory.NonSpacingMark)
{
stringBuilder.Append(c);
}
}
return stringBuilder.ToString().Normalize(NormalizationForm.FormC);
}
public override int Compare(string x, string y)
{
return string.Compare(RemoveDiacritics(x), RemoveDiacritics(y), StringComparison.OrdinalIgnoreCase);
}
}
然后要使用它,您需要在打开数据库之前注册它:
SQLiteFunction.RegisterFunction(typeof(SQLiteNormalizedComparer));
完成此操作后,您可以将该排序规则添加到表中,例如:
CREATE TABLE `myTable` (
`Id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
`Name` TEXT NOT NULL COLLATE NORMALIZEDCI)
同样,这一切都未经过测试......我使用了来自这里和那里的片段来做出这个答案,但我不希望复制和放弃。粘贴会起作用。我真的没有一个可以测试它的环境。
此外,我不是自己对表格进行整理(这可能会使其无法移植),而是进行额外的搜索"列,您可以在其中插入规范化(例如,删除了变音符号)字符串,因此您将其用于搜索,并将原始文件用于显示。这实际上几乎使您的存储需求增加了一倍,但SqLite数据库通常很小,所以您可以在这里选择。