如何使用Regex在c#中搜索字符串,忽略重音;
例如在Notepad ++中,对于古希腊语,使用正则表达式进行搜索: [[=α=]] 将返回:α,ἀἀ,ᾶ,ὰ,ά,ᾳ,< / strong> ....
我知道Notepad ++正在使用PCRE标准。 如何在c#中执行此操作?是否存在等价语法?
修改:
我已经尝试过字符串规范化了。不适合希腊人。例如:“ᾶ”.Normalize(NormalizationForm.FormC)将返回ᾶ。看起来规范化仅在“组合字符”的情况下删除重音符号。 ᾶ字符是Unicode中的单独字符!
答案 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);
}
}
输出:
ἀἁἂἃἄἅἆἇὰάᾀᾁᾂᾃᾄᾅᾆᾇᾰᾱᾲᾳᾴᾶᾷᾶ
αααααααααααααααααααααααααα
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)