假设我想将“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名字#和我的姓氏在一起”
答案 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