删除变音符号,某些字母上的某些变音符号除外
Posted
技术标签:
【中文标题】删除变音符号,某些字母上的某些变音符号除外【英文标题】:Remove diacritics, except for certain diacritics on certain letters 【发布时间】:2019-03-03 14:20:45 【问题描述】:我正在尝试删除希伯来语变音符号。我需要删除所有变音符号,除了给定的变音符号,在给定的字母之后。
这是我不工作的RemoveDiacritics
(见fiddle):
public static string RemoveDiacritics(Dictionary<char, char[]> exclude, string source)
// Exclude letters (using a lookbehind), include diacritics
string match = "(?<=[א-ת])[\u05b0-\u05c2]";
// Prepare the exclusion group
string exclusionGroup = string.Join("|", exclude.Select(p =>
string.Concat(p.Key, string.Join(string.Empty, p.Value)))
);
// Create the exclusion group (using a lookahead)
string except = $"(?!exclusionGroup)";
// Do the match
return Regex.Replace(source, string.Concat(except, match), string.Empty);
我测试过:
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);
预期结果:"חזיתי כּמבַּעד לעשן בקמורי הרסס הלבן"
(第 2 个单词只有 2 个字母应该有变音符号)。
实际结果:"חזיתי כְמִבַעד לעשָן בְקמורי הרסס הלָבן"
在我的实际结果中,你可以看到:
任何带有'\u05bc'
的字母(就是一个字母内的那个小点)和一个附加的变音符号,错误地留下了那个附加的变音符号。
另外,מִ
和 שָ
上还有变音符号(它们分别位于第 2 个和第 3 个单词)。不知道为什么。
我怎样才能让它工作?
【问题讨论】:
作为第一步,我将调试输出exclusionGroup
的运行时值并测试生成的正则表达式
@dlatikay,我得到了预期的结果,即(?!כּ|בַּ)
,这就是我需要的(或者我需要吗?)。
你的意思是你想删除所有的变音符号,但在一些字母之后?
@Wiktor Stribiżew,没错。
然后,尝试类似@"(what_you_need_to_keep)|\pM+"
并替换为$1
。
【参考方案1】:
你的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)|\pM+", exclusionGroup));
return Regex.Replace(source, leaveOnly, "$1");
它的作用是:
exclusionGroup
是从 exclude
字符创建的,这只是一个交替序列
leaveOnly
是正则表达式模式,它的形式是 (<what_you_need_to_keep>)|\pM+
,它匹配并捕获您需要保留(忽略)到第 1 组的内容,并且只匹配使用 \pM+
模式的任何 1+ 变音符号。
替换模式是第 1 组值 $1
的占位符,用于在结果字符串中恢复它。
这是online C# demo。
【讨论】:
@HeyJude 据我了解,它与所有变音符号都不匹配,并且负前瞻和正后瞻在字符串内的同一位置执行。以上是关于删除变音符号,某些字母上的某些变音符号除外的主要内容,如果未能解决你的问题,请参考以下文章