【问题标题】:Culture issue with regexp正则表达式的文化问题
【发布时间】:2015-04-08 10:06:27
【问题描述】:

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

我有这行代码:

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

这非常适用于例如消息“我的名字是 bob”中的“bob”。

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

我认为添加 RegexOptions.CultureInvariant 会有所帮助,但似乎没有。

任何帮助将不胜感激。

【问题讨论】:

    标签: c# regex


    【解决方案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

    【讨论】:

      【解决方案2】:

      该选项 (RegexOptions.CultureInvariant) 仅连接到 RegexOptions.IgnoreCase。来自https://msdn.microsoft.com/en-us/library/system.text.regularexpressions.regexoptions(v=vs.90).aspx

      文化不变

      指定忽略语言中的文化差异。 有关详细信息,请参阅在正则表达式命名空间中执行文化不敏感操作。

      我认为除了有一个不带变音符号的文本版本(例如参见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?

      【讨论】:

        猜你喜欢
        • 2011-03-12
        • 1970-01-01
        • 2011-07-10
        • 1970-01-01
        • 2018-03-08
        • 2011-01-25
        相关资源
        最近更新 更多