使用方法次
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);
}
そして、それは
string s = "I am an old élephant";
string pattern = "elephant";
bool result = new Regex(pattern, RegexOptions.IgnoreCase).IsMatch(removeDiacritics(s)); //true
た場合に動作しますあなたは何かを置き換える必要があります。 matchcollectionを(逆方向に)繰り返し、それぞれの一致のインデックスに応じて元の文字列を編集します。
、について説明:(私は、文字列「私は古い象だ」使用しています)
のリストに、元の文字列のすべての文字を書いてみましょう:
foreach (char c in str)
{
chars1.Add(c);
}
として、 charがUnicode char 233または00E9として定義されていることがわかります(http://unicode-table.com/de/#00E9参照)
ここで正規化について説明します
documentionが言うように: フォームD:
char型のEはEとアクセント文字の中に "分割" されていることを意味
Indicates that a Unicode string is normalized using full canonical decomposition.
。
ことを確認するには、聞かせての出力正規化された文字列の文字は:
List<char> chars2 = new List<char>();
foreach(char c in str.Normalize(NormalizationForm.FormD))
{
chars2.Add(c);
}
時計に見られるように
、Eは今や101(\ u0065)+ 2つの文字(に正規化されます 正規化された文字列のすべての文字を繰り返し処理し、 "NonSpacingMark"の場合はStringBuilderに追加します。
MSDN: https://msdn.microsoft.com/en-us/library/system.globalization.unicodecategory(v=vs.110).aspx
NonSpacingMark基本文字の修飾を示す
ノンスペーシング文字。 ユニコード指定「Mn」(マーク、スペースなし)で示されます。 値は、今私たちの文字列に2つのまたは3文字のように定義されている他のすべての文字は、Unicodeの文字記号に「変換」になっていることを確認するために、最後に5.
で、私たちは私たちの新しいを正規化する必要があります文字列をFormCに戻します。
MSDN: FormC:
が可能な場合、それらの 主要複合材を有する配列の置換に続いて、Unicode文字列を完全正規 分解を用いて正規化されていることを示します。
"私がテストしたときの私の文化は、あなたが' RegexOptions.CultureInvariant'を指定したので無関係です。 – hvd
@ A.D。 http://stackoverflow.com/questions/249087/how-do-i-remove-diacritics-accents-from-a-string-in-net –