C#中关于字符等价的正则表达式

时间:2018-04-06 16:44:04

标签: c# .net regex

如何使用Regex在c#中搜索字符串,忽略重音;

例如在Notepad ++中,对于古希腊语,使用正则表达式进行搜索: [[=α=]] 将返回:α,ἀἀ,ᾶ,ὰ,ά,ᾳ,< / strong> ....

我知道Notepad ++正在使用PCRE标准。 如何在c#中执行此操作?是否存在等价语法?

修改

我已经尝试过字符串规范化了。不适合希腊人。例如:“ᾶ”.Normalize(NormalizationForm.FormC)将返回ᾶ。看起来规范化仅在“组合字符”的情况下删除重音符号。 ᾶ字符是Unicode中的单独字符!

2 个答案:

答案 0 :(得分:2)

System.String.Normalize方法似乎仍然是解决此问题的关键。

using System;
using System.Text;
using System.Text.RegularExpressions;
using System.Globalization;
using System.Linq;

public class Program
{
    public static void Main()
    {
        string rawInput = "ἀἁἂἃἄἅἆἇὰάᾀᾁᾂᾃᾄᾅᾆᾇᾰᾱᾲᾳᾴᾶᾷ";
        Console.WriteLine(rawInput);
        string normalizedInput = Utility.RemoveDiacritics(rawInput);    
        string pattern = "α+";

        var result = Regex.Matches(normalizedInput, pattern);
        if(result.Count > 0)
            Console.WriteLine(result[0]);    
    }
}

public static class Utility
{
    public static string RemoveDiacritics(this string str)
    {
        if (null == str) return null;
        var chars =
            from c in str.Normalize(NormalizationForm.FormD).ToCharArray()
            let uc = CharUnicodeInfo.GetUnicodeCategory(c)
            where uc != UnicodeCategory.NonSpacingMark
            select c;

        return new string(chars.ToArray()).Normalize(NormalizationForm.FormC);
    }
}

输出:

ἀἁἂἃἄἅἆἇὰάᾀᾁᾂᾃᾄᾅᾆᾇᾰᾱᾲᾳᾴᾶᾷᾶ
αααααααααααααααααααααααααα

Demo

Kaplan的原创方法:

static string RemoveDiacritics(string text) 
{
    var normalizedString = text.Normalize(NormalizationForm.FormD);
    var stringBuilder = new StringBuilder();        
    foreach (var c in normalizedString)
    {
        var unicodeCategory = CharUnicodeInfo.GetUnicodeCategory(c);
        if (unicodeCategory != UnicodeCategory.NonSpacingMark)
        {
            stringBuilder.Append(c);
        }
    }       
    return stringBuilder.ToString().Normalize(NormalizationForm.FormC);
}

参考文献:

PS:不幸的是,PCRE.NET,Lucas Trzesniewski的PCRE库的.NET包装器不支持(扩展)POSIX整理元素。

答案 1 :(得分:0)