我试图去除希伯来文变音符号。我需要删除所有变音符号,但排除在给定字母后出现的指定变音符号。
这是我的不起作用的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);
}
期望结果:"חזיתי כּמבַּעד לעשן בקמורי הרסס הלבן"
(只有第二个单词的两个字母应该有音标)。
实际结果:"חזיתי כְמִבַעד לעשָן בְקמורי הרסס הלָבן"
在我的实际结果中,您可以看到:
任何带有
'\u05bc'
(它是那个字母内部的小点)和额外变音符号的字母都错误地保留了该额外变音符号。此外,
מִ
和שָ
上保留了变音符号(它们分别位于第二个和第三个单词)。不知道为什么。
如何使其正常工作?
(?!כּ|בַּ)
,这正是我需要的(或者不是吗?)。 - OfirD@"(what_you_need_to_keep)|\p{M}+"
的表达式,并替换为$1
。 - Wiktor Stribiżew