Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 删除变音符号,但某些字母上的某些变音符号除外_C#_Regex_Regex Lookarounds_Diacritics - Fatal编程技术网

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

C# 删除变音符号,但某些字母上的某些变音符号除外,c#,regex,regex-lookarounds,diacritics,C#,Regex,Regex Lookarounds,Diacritics,我想去掉希伯来语的发音符号。我需要删除所有的变音符号,除了给定的变音符号,在给定的字母之后 这是我的非工作RemoveDiacritics(请参阅): publicstaticstringremovediacritics(字典排除,字符串源) { //排除字母(使用lookback),包括变音符号 string match=“(?您的RemoveDiacritics方法应该如下所示 public static string RemoveDiacritics(Dictionary<char,

我想去掉希伯来语的发音符号。我需要删除所有的变音符号,除了给定的变音符号,在给定的字母之后

这是我的非工作<代码>RemoveDiacritics(请参阅):

publicstaticstringremovediacritics(字典排除,字符串源)
{
//排除字母(使用lookback),包括变音符号

string match=“(?您的
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, "$1");
}
publicstaticstringremovediacritics(字典排除,字符串源)
{
string excludegroup=string.Join(“|”,exclude.Select(p=>string.Concat(p.Key,string.Join(string.Empty,p.Value)));
string leaveOnly=string.Concat(string.Format(@“({0})|\p{{M}}}+”,excludegroup));
return Regex.Replace(source,leaveOnly,“$1”);
}
它所做的是:

  • excludegroup
    是从
    exclude
    字符创建的,这只是一个交替序列
  • leaveOnly
    是正则表达式模式,它的形式是
    ()|\p{M}+
    ,匹配并捕获需要保留(忽略)到组1中的内容,并使用
    \p{M}+
    模式匹配任何1+变音符号
  • 替换模式是palceholder到组1的值,
    $1
    ,用于将其恢复到结果字符串中

下面是一个.

作为第一步,我将调试输出
excludegroup
的运行时值,并测试结果regex@dlatikay,我得到了预期的结果,即
(?!ּּӡַּּ)
,这就是我需要的(或者我应该做什么?).你的意思是说你想去掉所有的变音符号,只是在一些字母后面加上一些?@Wiktor Stribiżew,没错。然后,试试类似于
@(你需要保留什么)|\p{M}+“
并替换为
$1
@HeyJude,据我所知,它不匹配所有的变音符号,并且在字符串中的同一位置执行了负先行和正后先行。
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);
}
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, "$1");
}