用不同的值替换一个单词

本文关键字:一个 单词 替换 | 更新日期: 2023-09-27 18:14:37

我有一个字符串"{Day} -是胜利日。{Day} -是我的生日";

如何用不同的数字替换{Day} ?我试着:

string text = "{Day} - is a victory day. {Day} - is my birthday";
if (text.Contains("{Day}"))
    text = text.Replace("{Day}", xNet.Rand.Next(1, 30).ToString());

但是day在两次替换中是相同的

用不同的值替换一个单词

使用Regex.ReplaceMatchEvaluator委托:

string text = "{Day} - is a victory day. {Day} - is my birthday";
text = Regex.Replace(text, @"'{Day'}", m => xNet.Rand.Next(1, 30).ToString());

String.Replace将字符串作为"replace with"参数,并将所有出现的字符串替换为该参数。例如,在您的情况下,Rand可能会生成字符串19 一次,然后将其传递给Replace,并将替换所有出现的{Day}

如果你想为每个匹配生成一个新的替换,你可以使用Regex.Replace代替,它可以使用一个函数/lambda,每次匹配调用一次来生成替换字符串;

text = Regex.Replace(text, Regex.Escape("{Day}"),
        match => xNet.Rand.Next(1,30).ToString());

这是因为xNet.Rand.Next(1, 30).ToString()只被调用一次。也就是说,当text.Replace(..)触发时。

要用不同的数字替换每个出现,您可以这样做:

string searchString = "{Day}";
int foundIndex = text.IndexOf(searchString);
while (foundIndex > -1)
{
  text = text.Substring(0, foundIndex) 
           + xNet.Rand.Next(1, 30).ToString() 
           + text.Substring(foundIndex + searchString.Length);
  foundIndex = text.IndexOf(searchString);
}

未测试,但这应该给你一个如何解决它的线索。

根据相关的(String.Replace) MSDN条目:

返回一个新字符串,其中是指定对象的所有出现当前字符串中的Unicode字符或字符串将被替换为其他指定的Unicode字符或字符串。

http://msdn.microsoft.com/en-us/library/system.string.replace.aspx

注意,它替换了所有出现的。在您当前的代码中,您正在用相同的随机生成的值替换这两个出现。

两种可能的解决方案:

  • 将原始字符串拆分为两个:替换第一个字符串的值,然后替换第二个字符串的值,然后再将两个字符串连接起来。
  • 将第一个{Day}参数重命名为,例如{Day0};第二个是{Day1}。然后生成一个随机值。

是,因为Rand.Next只求值一次,所以相同的值将被替换。

您可以使用正则表达式或手动执行:

string text = "{Day} - is a victory day. {Day} - is my birthday";
var sb = new StringBuilder(text);
while (text.Contains("{Day}"))
{
  int p=text.IndexOf("{Day}");
  sb.Remove(p,5);
  sb.Insert(p, xNet.Rand.Next(1, 30).ToString());
  text = sb.ToString();
}

这可能不是你想做的最好的方法…但是您至少需要了解您只调用text.Replace()方法一次,并且它按预期工作。例如,用该方法生成的数字替换{Day}的每个实例。如果您希望它们是两个不同的值,则需要替换两个不同的值。

    string text = "{Day} - is a victory day.  {Day2} - is my birthday";
    text = text.Replace("{Day}", xNet.Rand.Next(1, 30).ToString());
    text = text.Replace("{Day2}", xNet.Rand.Next(1, 30).ToString());