删除字符串中的重音符号,除了“ñ”

时间:2017-11-25 17:03:53

标签: c# regex normalization utf-16

我有以下示例代码:

var inputString = "ñaáme";
inputString = inputString.Replace('ñ', '\u00F1');
var normalizedString = inputString.Normalize(NormalizationForm.FormD);
var result = Regex.Replace(normalizedString, @"[^ñÑa-zA-Z0-9\s]*", string.Empty);
return result.Replace('\u00F1', 'ñ'); // naame :(

我需要在不删除“ñ”的情况下规范化文本

I followed this example 但它适用于Java而且它对我不起作用

我希望你的结果是:“ñaame”。

1 个答案:

答案 0 :(得分:6)

您可以使用ñ正则表达式匹配除特定字母(?i)[\p{L}-[ña-z]]+以外的任何Unicode字母和不需要规范化的ASCII字母,并将其标准化。然后,还要从字符串中删除任何组合标记。

使用

var inputString = "ñaáme";
var result = string.Concat(Regex.Replace(inputString, @"(?i)[\p{L}-[ña-z]]+", m => 
        m.Value.Normalize(NormalizationForm.FormD)
    )
    .Where(c => CharUnicodeInfo.GetUnicodeCategory(c) != UnicodeCategory.NonSpacingMark));
Console.Write(result);

请参阅C# demo

模式说明

  • (?i) - 忽略大小写修饰符
  • [ - 开始一个角色类
    • \p{L} - 任何Unicode字母
    • -[ - 除了
      • ña-z - ñ和ASCII字母
    • ] - 减法类的结尾
  • ]+ - 发生一次或多次。