Verwendung folgender Methode:
public string removeDiacritics(string str)
{
var sb = new StringBuilder();
foreach (char c in str.Normalize(NormalizationForm.FormD))
{
if (CharUnicodeInfo.GetUnicodeCategory(c) != UnicodeCategory.NonSpacingMark)
{
sb.Append(c);
}
}
return sb.ToString().Normalize(NormalizationForm.FormC);
}
Dann funktioniert es
string s = "I am an old élephant";
string pattern = "elephant";
bool result = new Regex(pattern, RegexOptions.IgnoreCase).IsMatch(removeDiacritics(s)); //true
Wenn Sie müssen etwas ersetzen, z. Iteriere (rückwärts) durch die Matchcollection und bearbeite deine ursprüngliche Zeichenkette abhängig von den Indizes jeder Übereinstimmung.
Explaination: (i bin mit der "Ich bin ein alter Elefant" string)
Lassen Sie uns alle Zeichen der ursprünglichen Zeichenfolge in eine Liste schreiben:
foreach (char c in str)
{
chars1.Add(c);
}
Wie Sie können sehen, das Char ist definiert als Unicode Char 233 oder 00E9 (siehe http://unicode-table.com/de/#00E9)
Die Normalisierung wird hier erklärt https://msdn.microsoft.com/en-us/library/system.text.normalizationform(v=vs.110).aspx
Wie die Dokumention sagt: Form D:
Indicates that a Unicode string is normalized using full canonical decomposition.
Das bedeutet, dass das Zeichen é wird in eine E und einem Akzente char "aufgeteilt".
Um das zu überprüfen, lassen Sie sie gibt die Zeichen des normalisierten string:
List<char> chars2 = new List<char>();
foreach(char c in str.Normalize(NormalizationForm.FormD))
{
chars2.Add(c);
}
Wie in der Uhr zu sehen ist, wird das é nun in 2 Zeichen normalisiert (101 (\ u0065) + 769 (\ u0301))
Jetzt müssen wir diese Akzente beseitigen: Durch alle Zeichen der normalisierten Zeichenkette Iterieren und wenn es eine "NonSpacingMark" ist, fügen Sie sie zum StringBuilder hinzu.
MSDN: https://msdn.microsoft.com/en-us/library/system.globalization.unicodecategory(v=vs.110).aspx
NonSpacingMark
Ohne Zwischenraum Charakter, die Modifikationen eines Basiszeichen angibt. Bezeichnet mit der Unicode-Bezeichnung "Mn" (Marke, Nonspacing). Der Wert ist 5.
Schließlich, um sicherzustellen, dass alle anderen Zeichen, die jetzt als 2 oder 3 Zeichen in unserem String definiert sind, werden „umgewandelt“ in das Unicode-Zeichen Symbol bekommen, müssen wir unsere neuen normalisieren String zurück zum FormC.
MSDN: FormC:
Zeigt an, dass eine Unicode-Zeichenfolge normiert volle kanonische Zersetzung verwendet wird, gefolgt von der Ersetzung von Sequenzen mit ihrer primären Komposite, wenn möglich.
"Meine Kultur beim Testen ist" irrelevant, da Sie 'RegexOptions.CultureInvariant' angegeben haben. – hvd
@ A.D. Sehen Sie sich http://stackoverflow.com/questions/249087/how-do-i-remove-diacritics-accents-from-a-string-in-net –