0

我有一个类似的列表:

  • 乔治
  • 米歇尔 fgu
  • 亚瑟尔

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

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

但是然后“fgu”变成“fguhCoolu”和“fguh”变成“fguhCooluh”有更好的主意吗?

谢谢你的帮助。

4

3 回答 3

3

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

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

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

这将被一些学生实现为一个带有 if-else 条件的循环。这样您就不会替换已替换的“fguhCool”中的“fg”。

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

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

于 2012-04-27T07:05:49.120 回答
0

您可以使用正则表达式:

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

\b匹配所谓的单词边界,这意味着它匹配单词的开头或结尾(粗略,但为此目的足够了)。

于 2012-04-27T06:46:16.713 回答
0

使用正则表达式:

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

另一种方法是先将长词替换为短词,然后将短词替换为最终值(我假设所有词 - “fg”、“fgu”和“fguh” - 将映射到相同的值“fguhCool “, 正确的?)

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

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

于 2012-04-27T06:47:07.430 回答