删除变音符号,某些字母上的某些变音符号除外
Remove diacritics, except for certain diacritics on certain letters
我正在尝试删除希伯来语变音符号。我需要删除给定字母之后的所有变音符号,除了给定的变音符号。
这是我的非工作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 个字母应该有变音符号)。
实际结果:"חזיתי כְמִבַעד לעשָן בְקמורי הרסס הלָבן"
在我的实际结果中,你可以看到:
任何带有 '\u05bc'
的字母(就是 里面 一个字母的那个小点)连同一个额外的变音符号,被错误地留下了那个额外的变音符号。
此外,מִ
和 שָ
上还留有变音符号(它们分别位于第 2 个和第 3 个单词上)。不知道为什么。
我怎样才能让它发挥作用?
您的 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, "");
}
它的作用是:
exclusionGroup
是从 exclude
个字符创建的,这只是一个交替序列
leaveOnly
是正则表达式模式,它的形式是 (<what_you_need_to_keep>)|\p{M}+
匹配并且 捕获 您需要保留(忽略)到组 1 中的内容使用 \p{M}+
模式匹配任何 1+ 变音符号。
- 替换模式是第 1 组值
的占位符,以在结果字符串中恢复它。
这是一个online C# demo.
我正在尝试删除希伯来语变音符号。我需要删除给定字母之后的所有变音符号,除了给定的变音符号。
这是我的非工作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 个字母应该有变音符号)。
实际结果:"חזיתי כְמִבַעד לעשָן בְקמורי הרסס הלָבן"
在我的实际结果中,你可以看到:
任何带有
'\u05bc'
的字母(就是 里面 一个字母的那个小点)连同一个额外的变音符号,被错误地留下了那个额外的变音符号。此外,
מִ
和שָ
上还留有变音符号(它们分别位于第 2 个和第 3 个单词上)。不知道为什么。
我怎样才能让它发挥作用?
您的 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, "");
}
它的作用是:
exclusionGroup
是从exclude
个字符创建的,这只是一个交替序列leaveOnly
是正则表达式模式,它的形式是(<what_you_need_to_keep>)|\p{M}+
匹配并且 捕获 您需要保留(忽略)到组 1 中的内容使用\p{M}+
模式匹配任何 1+ 变音符号。- 替换模式是第 1 组值
的占位符,以在结果字符串中恢复它。
这是一个online C# demo.