我正在尝试计算消息中某个单词的出现次数。
我有这行代码:
var nbOccurences = Regex.Matches(haystack, needle, RegexOptions.CultureInvariant | RegexOptions.IgnoreCase).Count;
对于例如“bob”在消息“我的名字是bob”。
但是(因为信息可以是法语),我希望能够找到“chene”,“chène”,“chêne”......在寻找“chene”时。现在,带有重音的单词不会出现结果。
我认为添加RegexOptions.CultureInvariant会有所帮助,但看起来并不像。
任何帮助都将不胜感激。
答案 0 :(得分:1)
您可以使用此方法将扩展字母转换为其基数:
string RemoveDiacritics(string stIn)
{
var stFormD = stIn.Normalize(NormalizationForm.FormD);
var sb = new StringBuilder();
for (var ich = 0; ich < stFormD.Length; ich++)
{
var uc = System.Globalization.CharUnicodeInfo.GetUnicodeCategory(stFormD[ich]);
if (uc != System.Globalization.UnicodeCategory.NonSpacingMark)
sb.Append(stFormD[ich]);
}
return (sb.ToString().Normalize(NormalizationForm.FormC));
}
然后:
var haystack = "chêne name is chène";
var needle = "chène";
var nbOccurences = Regex.Matches(RemoveDiacritics(haystack), RemoveDiacritics(needle), RegexOptions.CultureInvariant | RegexOptions.IgnoreCase).Count;
nbOccurences
将等于2
。
答案 1 :(得分:0)
该选项(RegexOptions.CultureInvariant
)仅与RegexOptions.IgnoreCase
相关联。来自https://msdn.microsoft.com/en-us/library/system.text.regularexpressions.regexoptions(v=vs.90).aspx
CultureInvariant
指定忽略语言中的文化差异。 有关详细信息,请参阅RegularExpressions命名空间中执行文化不敏感操作。
除了在没有变音符号的情况下搜索文本的版本之外,我认为没有办法做你想做的事情(参见例如How do I remove diacritics (accents) from a string in .NET?)
请注意,如果您只是想找一个单词,您可以:
var compareinfo = CultureInfo.InvariantCulture.CompareInfo;
var index = compareinfo.IndexOf("My name is chêne", "chene", CompareOptions.IgnoreNonSpace | CompareOptions.IgnoreCase);
bool found = index > -1;