删除变音符号,某些字母上的某些变音符号除外

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 是正则表达式模式,它的形式是 (&lt;what_you_need_to_keep&gt;)|\pM+,它匹配并捕获您需要保留(忽略)到第 1 组的内容,并且只匹配使用 \pM+ 模式的任何 1+ 变音符号。 替换模式是第 1 组值 $1 的占位符,用于在结果字符串中恢复它。

这是online C# demo。

【讨论】:

@HeyJude 据我了解,它与所有变音符号都不匹配,并且负前瞻和正后瞻在字符串内的同一位置执行。

以上是关于删除变音符号,某些字母上的某些变音符号除外的主要内容,如果未能解决你的问题,请参考以下文章

如何从 .NET 中的字符串中删除变音符号(重音符号)?

python 删除变音符号去掉文本中字符的附加符号

美国布局的变音符号和其他符号的替代键盘映射

局部匹配忽略案例和变音符号

在 JavaScript 中删除字符串中的重音符号/变音符号

用英语等价物替换德语字符(变音符号、重音符号)