使用下面的方法:
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);
}

由於你可以看到字符被定義爲Unicode字符233或00E9(見http://unicode-table.com/de/#00E9)
標準化在這裏解釋 https://msdn.microsoft.com/en-us/library/system.text.normalizationform(v=vs.110).aspx
作爲機制的文檔說: 形式d:
Indicates that a Unicode string is normalized using full canonical decomposition.
這意味着,炭E是「分裂」成e和口音炭。
要檢查,讓我們輸出的標準化字符串的字符:
List<char> chars2 = new List<char>();
foreach(char c in str.Normalize(NormalizationForm.FormD))
{
chars2.Add(c);
}

如表所示,E是現在歸到2個字符(101(\ u0065)+ 769(\ u0301))
現在我們必須消除這些重音: 遍歷規範化字符串的所有字符,如果它是「NonSpacingMark」,則將其添加到StringBuilder。
MSDN: https://msdn.microsoft.com/en-us/library/system.globalization.unicodecategory(v=vs.110).aspx
NonSpacingMark
非間距字符表示基字符的修改。 由Unicode指定「Mn」(標誌,非間距)表示。該 值爲5
最後,以確保所有其他字符,即現在被定義爲我們的字符串2個或3個字符,越來越「轉換」成Unicode字符符號,我們必須正常化我們的新串返回到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 –