我有一个列表:
我想用“fguhCool”替换fg,fgu和fguh我已经尝试过这样的事情:
foreach (var ignore in NameToPoulate)
{
tempo = ignore.Replace("fg", "fguhCool");
NameToPoulate_t.Add(tempo);
}
但随后“fgu”成为“fguhCoolu”而“fguh”成为“fguhCooluh”是否有更好的主意?
感谢您的帮助。
答案 0 :(得分:3)
我认为这是一项家庭作业,并且您正在接受特定算法的测试,而不是任何执行该作业的代码。
这可能是你老师的想法:
学生会意识到代码应首先检查“fguh”,然后检查“fgu”然后检查“fg”。顺序很重要,因为正如您所注意到的那样,替换“fg”会破坏“fguh”。
这将由一些学生实施为一个循环,其中包含if-else条件。这样你就不会替换已经替换过的“fguhCool”中的“fg”。
但是如果“fg”和“fgu”都在同一个字符串中,你会发现算法会崩溃。你不能允许“fgu”的存在阻止你在字符串的不同部分检查“fg”。
您的老师正在寻找的答案可能是您应首先找到“fguh”,“fgu”和“fg”(按此顺序),并将其替换为不包含“fg”的中间字符串。完成后,您可以搜索该中间字符串并将其替换为“fguhCool”。
答案 1 :(得分:0)
您可以使用正则表达式:
Regex.Replace(@"\bfg\b", "fguhCool");
\b
匹配所谓的字边界,这意味着它匹配单词的beginnnig或结尾(粗略地说,但为了这个目的)。
答案 2 :(得分:0)
使用正则表达式:
Regex.Replace("fg(uh?)?", "fguhCool");
另一种方法是首先替换短的长单词,然后替换结束值的短语(我假设所有单词 - “fg”,“fgu”和“fguh” - 将映射到相同的值“fguhCool”,对吗?)
tempo = ignore
.Replace("fguh", "fg")
.Replace("fgu", "fg")
.Replace("fg", "fguhCool");
Obs。:假设这些单词可以出现在字符串中的任何位置。如果你担心整个单词(即那些单词不是更大单词的子串)的情况,那么请参阅@Joey的答案(在这种情况下,简单的替换不会做,正则表达式真的是最好的选择)。