搜索字符串,忽略重音

时间:2016-07-12 07:09:33

标签: c# sql sqlite

我使用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);

更新

我的数据库中有不同的值:

  1. An der Muhle
  2. AnderMühle
  3. 在这两种情况下,如果用户搜索“Muhle”,我也必须找到“Mühle”。我使用上面的正则表达式模式搜索并且运行良好,但现在我必须与sql查询相同。

2 个答案:

答案 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数据库通常很小,所以您可以在这里选择。