如何避免C#替换以通过第二次替换再次替换新字符串

时间:2014-01-01 14:18:37

标签: c# replace

假设我想将“First Name”和“Name”这两个短语替换为“#First Name”。

例如:

string text = "first name and name should be with # as preffix and suffix";
text = text.Replace("first name", "#first name#");
text = text.Replace("name", "#name#");
Console.WriteLine(text);

我希望输出结果为:“#first name#和#name#应该是#作为预加词和后缀”​​

但是第二个替换也替换了被替换的文本,因此短语#first name#中的“名称”再次被替换:#first#name ##和#name#应该用#作为前缀和后缀。

是否有选项可以保护以#开头和结尾的短语,或者对两个短语的“一次拍摄”进行替换?

感谢。

第一次更换后: “我的全名是我的#first名字#和我的姓氏在一起”

5 个答案:

答案 0 :(得分:6)

使用中间值:

string text = "first name and name should be with # as preffix and suffix";
text = text.Replace("first name", "#SOME_UNIQUE_CODE#");
text = text.Replace("name", "#name#");
text = text.Replace("#SOME_UNIQUE_CODE#", "#first name#");
Console.WriteLine(text);

或使用正则表达式替换。

答案 1 :(得分:3)

如果该代码是文字的,请使用string.Format。

string.Format("{0} and {1} should be with # as preffix and suffix", "#first name#", "#name#");

您还可以撤消排序并将替换的文本包含在任何重叠的替换中:

string text = "first name and name should be with # as preffix and suffix";
text = text.Replace("name", "#name#");
text = text.Replace("first #name#", "#first name#");
Console.WriteLine(text);

答案 2 :(得分:1)

Regex.Replace(input, "(first\ name|name)", match => {
 if (match.Value == "name") return "#name#";
 else if (match.Value == "first name") return "#first name#";
 else throw new InvalidOperationException("bug");
});

使用正则表达式一次匹配所有可能的字符串,然后在匹配评估器中决定要替换的内容。这种方法非常易于扩展,而且不是黑客攻击。

答案 3 :(得分:0)

您可以使用只替换前面或之后没有name的{​​{1}}出现的正则表达式:

#
  

#first name#和#name#应该带#作为预备和后缀

答案 4 :(得分:-2)

使用正则表达式..这是一个红宝石片段。 C#的翻译应该很简单

> puts str.gsub( /(first\s)?name/ , "#\\0#") 

=> #first name# and #name# should be with # as prefix and suffix