【发布时间】: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)|\p{M}+"并替换为$1。
标签: c# regex regex-lookarounds diacritics