正则表达式的文化问题

时间:2015-04-08 10:06:28

标签: c# regex

我正在尝试计算消息中某个单词的出现次数。

我有这行代码:

 var nbOccurences = Regex.Matches(haystack, needle, RegexOptions.CultureInvariant | RegexOptions.IgnoreCase).Count;

对于例如“bob”在消息“我的名字是bob”。

但是(因为信息可以是法语),我希望能够找到“chene”,“chène”,“chêne”......在寻找“chene”时。现在,带有重音的单词不会出现结果。

我认为添加RegexOptions.CultureInvariant会有所帮助,但看起来并不像。

任何帮助都将不胜感激。

2 个答案:

答案 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;

(摘自allow accented characters to be searchable?