使用以下方法:
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
如果您必须更换某些东西,例如迭代(向后)匹配集合并根据每个匹配项的索引编辑原始字符串。
说明:(我用的是“I am an old élephant”字符串)
让我们将原始字符串的所有字符写入一个列表:
foreach (char c in str)
{
chars1.Add(c);
}
如您所见,char 定义为 unicode char 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.
这意味着 char é 被“拆分”为一个 e 和一个重音字符。
为了检查这一点,让我们输出标准化字符串的字符:
List<char> chars2 = new List<char>();
foreach(char c in str.Normalize(NormalizationForm.FormD))
{
chars2.Add(c);
}
正如手表中所见,é 现在被规范化为 2 个字符(101 (\u0065) + 769 (\u0301))
现在我们必须消除这些重音:
遍历规范化字符串的所有字符,如果它是“NonSpacingMark”,则将其添加到 StringBuilder。
MSDN:
https://msdn.microsoft.com/en-us/library/system.globalization.unicodecategory(v=vs.110).aspx
非间距标记
指示对基本字符进行修改的非空格字符。
由 Unicode 名称“Mn”(标记,非空格)表示。这
值为 5。
最后,为了确保所有其他字符(现在在我们的字符串中定义为 2 或 3 个字符)都“转换”为 unicode 字符符号,我们必须将新字符串规范化回 FormC。
MSDN:
C型:
表示使用完整规范对 Unicode 字符串进行规范化
分解,然后用它们的序列替换
如果可能的话,使用初级复合材料。