Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.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#_.net - Fatal编程技术网

C#准确替换字符串/子字符串

C#准确替换字符串/子字符串,c#,.net,C#,.net,目前我有大量的拼音符号条目(在数组中),一些字符串是组合的,例如Diánnǎo=Dián+nǎo 现在的问题是我想替换一个包含2个或更多的字符串,例如: string[] Py = { "xi", "xia", "xian" }; string[] Km = { "shi", "shie, "shien" }; string[] Input = "xiaguo"; for (int i = 0; i < Py.Length; i++) if (Input.Contains(Py[i

目前我有大量的拼音符号条目(在数组中),一些字符串是组合的,例如
Diánnǎo
=
Dián
+
nǎo

现在的问题是我想替换一个包含2个或更多的字符串,例如:

string[] Py = { "xi", "xia", "xian" };
string[] Km = { "shi", "shie, "shien" };
string[] Input = "xiaguo";
for (int i = 0; i < Py.Length; i++)
    if (Input.Contains(Py[i]))
        Input = Input.Replace(Py[i], Km[i]);
string[]Py={“xi”、“xia”、“xian”};
字符串[]Km={“shi”,“shie”,“shien”};
字符串[]输入=“下过”;
对于(int i=0;i
上面的代码由于循环索引而出现问题,xiaguo包含xi变为真(shiaguo)不是(shieguo)因为xi先于xia

如何实现这一点?并确保获得
xia
而不是
xi


我在GitHub上发布的完整代码:

您可以为此使用常规表达式。 我修改了你的代码,所以正则表达式WIL只匹配席而不是夏。 正则表达式“席”与“席”匹配,B表示单词边界,所以只与那个词匹配。
string[] Py = { "xi", "xia", "xian" };
string[] Km = { "shi", "shie, "shien" };
string[] Input = "xiaguo";
string pattern = "xi\b"
Regex rgx = new Regex(pattern, RegexOptions.IgnoreCase);

for (int i = 0; i < Py.Length; i++)
{
     MatchCollection matches = rgx.Matches(Py[i]);
     if (matches.Count > 0)
     {
        Input = Input.Replace(Py[i], Km[i]);
     }
}
string[]Py={“xi”、“xia”、“xian”};
字符串[]Km={“shi”,“shie”,“shien”};
字符串[]输入=“下过”;
字符串模式=“xi\b”
Regex rgx=新的Regex(模式,RegexOptions.IgnoreCase);
对于(int i=0;i0)
{
输入=输入。替换(Py[i],Km[i]);
}
}

音调/语言细节的结构不容易,因此您可能会假设一些模式,然后发现它不适合某些“单词”。 无论如何,要处理已知场景,您必须按长度降序排列目标音调,然后对每个“单词”只执行一次替换(这将避免在处理时替换xixia

这些步骤将是:

  • 对于按长度递减排序的每次更换
  • 试着找口气
  • 如果找到:替换并标记为完成(跳转到下一个“word”)

  • 这里的想法与替换列表中的两个数字时的想法相同,例如,2对1和3对2。顺序确实很重要,如果用2替换3,那么最终将同时替换3和2对1。

    假设较长的标记优先于较短的标记,那么这两个数组可以转换为字典,然后按len排序钥匙的gth:

    var dic = new Dictionary<string, string>
    {
      {"xi","shi"},
      {"xia","shie"},   
      {"xian","shien"},
    }.OrderByDescending(x => x.Key.Length)
      .ThenBy(x => x.Key)
      .ToDictionary(x => x.Key, x => x.Value);
    
    string input = "xiaguo";
    
    foreach(var d in dic)
      input = input.Replace(d.Key, d.Value);
    
    Console.WriteLine(input);
    
    var dic=新字典
    {
    {“xi”,“shi”},
    {“夏”、“什”},
    {“xian”,“shien”},
    }.OrderByDescending(x=>x.Key.Length)
    .ThenBy(x=>x.Key)
    .ToDictionary(x=>x.Key,x=>x.Value);
    字符串输入=“下过”;
    foreach(dic中的变量d)
    输入=输入.替换(d.键,d.值);
    控制台写入线(输入);
    
    上面的示例使用字典排序:

    • 按钥匙的长度
    • 然后按字母键排序
    • 最后,LINQ查询被转换回字典

    从这里开始,只需迭代字典并替换所有标记;无需检查键/标记是否存在。

    根据字符长度降序排序数组,然后应用逻辑。也可以使用
    字典,而不是基于相同索引的两个数组。旁注:不需要检查
    Contains
    在调用replace之前,如果它不包含给定的字符串,结果字符串将保持不变。Habib,我将数组转换为字典,现在我丢失了…您的方法工作正常,我将使用
    TryGetValue
    方法避免第二次替换和精确。但是dict中不包含的单词将被跳过,如何显示不相关?