如何将确切的单词替换为列表中的另一个单词

本文关键字:单词 列表 另一个 替换 | 更新日期: 2023-09-27 18:32:21

我有一个列表,如下所示:

  • 乔治·
  • 米歇尔
  • ·
  • 亚西尔·

我想用"fguhCool"替换 fg、fgu 和 fguh,我已经尝试过这样的事情:

            foreach (var ignore in NameToPoulate)
        {
            tempo = ignore.Replace("fg", "fguhCool");
            NameToPoulate_t.Add(tempo);
        }

但是"fgu"变成了"fguhCoolu","fguh"变成了"fguhCooluh",有没有更好的主意?

感谢您的帮助。

如何将确切的单词替换为列表中的另一个单词

我假设这是一个家庭作业,并且您正在测试特定的算法,而不是任何完成这项工作的代码。

这可能是你的老师的想法:

学生将意识到代码应该首先检查"fguh",然后检查"fgu",然后检查"fg"。顺序很重要,因为正如您所注意到的,替换"fg"会破坏"fguh"。

一些学生将把这实现为一个循环,其中包含 if-else 条件。这样您就不会替换已经替换的"fguhCool"中的"fg"。

但是你会发现,如果"fg"和"fgu"都在同一个字符串中,算法就会崩溃。然后,您不能允许"fgu"的存在阻止您在字符串的不同部分检查"fg"。

你的老师正在寻找的答案可能是你应该首先找到"fguh","fgu"和"fg"(按这个顺序),并用不包含"fg"的中间字符串替换它们。然后,在完成此操作后,您可以搜索该中间字符串并将其替换为"fguhCool"。

您可以使用正则表达式:

Regex.Replace(@"'bfg'b", "fguhCool");

'b匹配所谓的单词边界,这意味着它匹配单词的开头或结尾(大致如此,但为此目的足够)。

使用正则表达式:

Regex.Replace("fg(uh?)?", "fguhCool");

另一种方法是先将长词替换为短词,然后将短词替换为结束值(我假设所有单词 - "fg","fgu"和"fguh" - 将映射到相同的值"fguhCool",对吧?

tempo = ignore
    .Replace("fguh", "fg")
    .Replace("fgu", "fg")
    .Replace("fg", "fguhCool");

Obs.:这假设这些单词可以出现在字符串中的任何位置。如果您担心整个单词(即这些单词不是较大单词的子字符串的情况),请查看@Joey的答案(在这种情况下,简单的替换不起作用,正则表达式确实是最佳选择)。