C# 删除变音符号,但某些字母上的某些变音符号除外
我想去掉希伯来语的发音符号。我需要删除所有的变音符号,除了给定的变音符号,在给定的字母之后 这是我的非工作<代码>RemoveDiacritics(请参阅):C# 删除变音符号,但某些字母上的某些变音符号除外,c#,regex,regex-lookarounds,diacritics,C#,Regex,Regex Lookarounds,Diacritics,我想去掉希伯来语的发音符号。我需要删除所有的变音符号,除了给定的变音符号,在给定的字母之后 这是我的非工作RemoveDiacritics(请参阅): publicstaticstringremovediacritics(字典排除,字符串源) { //排除字母(使用lookback),包括变音符号 string match=“(?您的RemoveDiacritics方法应该如下所示 public static string RemoveDiacritics(Dictionary<char,
publicstaticstringremovediacritics(字典排除,字符串源)
{
//排除字母(使用lookback),包括变音符号
string match=“(?您的RemoveDiacritics
方法应该如下所示
public static string RemoveDiacritics(Dictionary<char, char[]> exclude, string source)
{
string exclusionGroup = string.Join("|", exclude.Select(p => string.Concat(p.Key, string.Join(string.Empty, p.Value))));
string leaveOnly = String.Concat(String.Format(@"({0})|\p{{M}}+", exclusionGroup));
return Regex.Replace(source, leaveOnly, "$1");
}
publicstaticstringremovediacritics(字典排除,字符串源)
{
string excludegroup=string.Join(“|”,exclude.Select(p=>string.Concat(p.Key,string.Join(string.Empty,p.Value)));
string leaveOnly=string.Concat(string.Format(@“({0})|\p{{M}}}+”,excludegroup));
return Regex.Replace(source,leaveOnly,“$1”);
}
它所做的是:
excludegroup
是从exclude
字符创建的,这只是一个交替序列
leaveOnly
是正则表达式模式,它的形式是()|\p{M}+
,匹配并捕获需要保留(忽略)到组1中的内容,并使用\p{M}+
模式匹配任何1+变音符号
- 替换模式是palceholder到组1的值,
$1
,用于将其恢复到结果字符串中
下面是一个.作为第一步,我将调试输出excludegroup
的运行时值,并测试结果regex@dlatikay,我得到了预期的结果,即(?!ּּӡַּּ)
,这就是我需要的(或者我应该做什么?).你的意思是说你想去掉所有的变音符号,只是在一些字母后面加上一些?@Wiktor Stribiżew,没错。然后,试试类似于@(你需要保留什么)|\p{M}+“
并替换为$1
@HeyJude,据我所知,它不匹配所有的变音符号,并且在字符串中的同一位置执行了负先行和正后先行。
static void Main(string[] args)
{
string source = "חָזִיתִי כְּמִבַּעַד לֶעָשָׁן בְּקִמּוּרֵי הָרֶסֶס הַלָּבָן";
Dictionary<char, char[]> exclude = new Dictionary<char, char[]>
{
{'\u05db', new char[] {'\u05bc' } }, // כּ
{'\u05d1', new char[] {'\u05bc', '\u05b7' } }, // בַּ
};
string replaced = RemoveDiacritics(exclude, source);
}
public static string RemoveDiacritics(Dictionary<char, char[]> exclude, string source)
{
string exclusionGroup = string.Join("|", exclude.Select(p => string.Concat(p.Key, string.Join(string.Empty, p.Value))));
string leaveOnly = String.Concat(String.Format(@"({0})|\p{{M}}+", exclusionGroup));
return Regex.Replace(source, leaveOnly, "$1");
}