2016-07-12 2 views
0

Я использую 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); 

Update:

У меня есть разные значения в моей базе данных:

  1. дер Muhle
  2. An Der Mühle

В обоих случаях, если пользователь Ищите «Muhle». Мне тоже нужно найти «Mühle». Я использовал выше regex patternsearch и хорошо работает, но теперь у меня есть то же самое с sql-запросом.

+0

Не могли бы вы поделиться тем, что является вашим ключом и чего вы пытаетесь достичь? –

+0

Не могли бы вы также использовать SQL-запрос, который у вас есть? –

+0

В SqlServer можно указать «нечувствительный к акценту». Возможно ли это и в sqlite? –

ответ

1

Вы можете адаптировать свой фильтр и использовать его в SQL запросе:

string filter = key.Replace("u", "[uü]").Replace("a", "[aä]").Replace("o", "[oö]").Replace("s", "[sß]"); 
var SQLQuery = @"SELECT * FROM * WHERE key="+filter; 
+0

Не знаете, как правильно совместить 'ss'or' ß' в SQL. Ваш исходный код для ключа: '' ss "' генерирует фильтр: '' s | ßs | ß''. –

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, как правило, небольшие, поэтому ваш выбор здесь.

Смежные вопросы