我想创建一个忽略重音的正则表达式。
例如:
string s = "I am an old élephant";
string pattern = "elephant";
bool result = new Regex(pattern, RegexOptions.CultureInvariant).IsMatch(s);
我测试时的文化是:
System.Globalization.CultureInfo.CurrentCulture = Fr-fr
因此,我希望这段代码能够找到匹配项,但事实并非如此。
有没有简单的方法来为此匹配?
我试图制作一个StringReplace重载方法,该方法将用大象等替代élèphânt。
使用以下方法:
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进行迭代(向后),然后根据每个匹配项的索引来编辑原始字符串。
说明:(我使用的是“我是旧的élephant”字符串)
让我们将原始字符串的所有字符写入一个列表:
foreach (char c in str)
{
chars1.Add(c);
}
如您所见,char被定义为unicode char 233或00E9(请参见http://unicode-table.com/de/#00E9)
此处说明了规范化https://msdn.microsoft.com/zh-cn/library/system.text.normalizationform(v=vs.110).aspx
如文件所述:表格D:
Indicates that a Unicode string is normalized using full canonical decomposition.
这意味着该字符é被“拆分”为一个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/zh-CN/library/system.globalization.unicodecategory(v= vs.110) .aspx
非间距标记
表示基本字符的修改的非空格字符。由Unicode名称“ Mn”表示(标记,不带空格)。取值为5。
最后,要确保现在在字符串中定义为2或3个字符的所有其他字符都已“转换”为Unicode字符符号,我们必须将新字符串归一化为FormC。
MSDN:FormC:
表示使用完全规范分解对Unicode字符串进行规范化,如果可能的话,将序列替换为其主要组合。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句