2016-07-12 12 views
0

Ich benutze Reqex für die Pattern-Suche. Ich habe CSV-Daten verwendet, aber Daten müssen in csv übereinstimmen. Ich habe SQLite als Datenbank gewählt. Ich muss eine Mustersuche durchführen, um nur diese Daten zu extrahieren. Ist es auch mit SQLite Abfrage möglich?Suche nach String, Akzente ignorieren

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:

Ich habe verschiedene Werte in der Datenbank:

  1. An der Muhle
  2. An der Mühle

In beiden Fällen ist die, ob der Benutzer Suche nach "Mühle" Ich muss auch "Mühle" finden. Ich habe oben regex patternsearch verwendet und funktioniert gut, aber jetzt muss ich gleich mit SQL-Abfrage.

+0

Können Sie teilen, was ist Ihr Schlüssel und was versuchen Sie zu erreichen? –

+0

Können Sie auch die SQL-Abfrage teilen, die Sie bisher haben? –

+0

In SqlServer ist es möglich, "akzentunempfindlich" anzugeben. Könnte das auch in sqlite möglich sein? –

Antwort

1

Sie können Ihre Filter und verwenden Sie es in SQL-Abfrage anpassen:

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

Nicht sicher, wie man 'ss' oder 'ß' in SQL richtig zusammenbringt. Ihr ursprünglicher Code für einen Schlüssel: '" ss "' erzeugt den Filter: '" s | ßs | ß "'. –

0

Eine Möglichkeit, zu tun, ist es eine benutzerdefinierte Kollatierung Registrierung ... das könnte man (! Völlig ungetestet) loszulegen:

[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); 
    } 
} 

Und dann, es zu benutzen, müssen Sie es registrieren, bevor Sie Ihre Datenbank öffnen:

SQLiteFunction.RegisterFunction(typeof(SQLiteNormalizedComparer)); 

Sobald dies erledigt ist, können Sie diese Sortierung zu Ihrer Tabelle hinzufügen, zum Beispiel:

CREATE TABLE `myTable` (
    `Id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, 
    `Name` TEXT NOT NULL COLLATE NORMALIZEDCI) 

Auch dies alles nicht getestet ... Ich Schnipsel verwenden ich von hier aus hatte und dort um diese Antwort zu geben, aber ich würde nicht erwarten, Kopie & Paste würde funktionieren. Ich habe hier keine Umgebung, in der ich das testen kann.

Anstatt eine eigene Kollatierung für eine Tabelle zu haben (was es möglicherweise nicht portabel macht), würde ich lieber eine zusätzliche "Suche" -Spalte haben, wo Sie normierte (zB mit diakritischen Zeichen) Zeichenfolgen einfügen können , so verwenden Sie das für die Suche und das Original für die Anzeige. Dies verdoppelt praktisch Ihre Speicheranforderungen, aber SqLite-Datenbanken sind in der Regel klein, also Ihre Wahl hier.