C#准确替换String / SubString

时间:2015-02-16 14:32:06

标签: 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]))
        Input = Input.Replace(Py[i], Km[i]);

由于循环索引,上面的代码存在问题,xiaguo包含xi变为真(shiaguo)而非(shieguo),因为xixia之前获得}

我如何实现这一目标?并确保获取xia而不是xi

我在GitHub上发布的完整代码:https://github.com/Anime4000/py2km/blob/beta/py2km.api/Converter.cs#L15

3 个答案:

答案 0 :(得分:0)

你可以使用常规表达式。 我修改了你的代码,所以正则表达式只匹配xi而不是xia。 正则表达式“xi \ b”匹配xi,而\ 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]);
     }
}

答案 1 :(得分:0)

语气/语言细节不可能有一个简单的结构,所以你可以假设一些模式,然后发现它不适合某些单词&#39;。 无论如何,为了处理明智的场景,你必须按照下降的长度订购目标音调,然后只对每个单词进行一次替换。 (处理 xian 时,这将避免替换 xi xia

步骤如下:

  1. 按长度递减排序的每次更换
  2. 尝试找到语气
  3. 如果找到:替换并标记为已完成(跳转到下一个&#39;单词&#39;)
  4. 这里的想法与替换列表中的两个数字相同,例如2比1和3比2。订单真的很重要,如果你用3替换2,那么你将把3和2都替换为1。

答案 2 :(得分:0)

假设较长的令牌优先于较短的令牌,则可以将2个数组转换为字典,然后按键的长度排序:

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);

以上示例对字典进行排序:

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

从那里,只需遍历字典并替换所有标记;没有必要检查密钥/令牌是否存在。