0

我有一个字符串“{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());

但是 2 次替换的天数相同。

4

6 回答 6

5

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());
于 2013-05-21T21:22:20.463 回答
2

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

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

text = Regex.Replace(text, Regex.Escape("{Day}"),
        match => xNet.Rand.Next(1,30).ToString());
于 2013-05-21T21:22:07.987 回答
0

是的,因为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();
}
于 2013-05-21T21:23:39.163 回答
0

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

    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());
于 2013-05-21T21:23:40.233 回答
0

发生这种情况是因为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);
}

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

于 2013-05-21T21:22:03.020 回答
0

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

返回一个新字符串,其中当前字符串中出现的所有指定 Unicode 字符或字符串都替换为另一个指定的 Unicode 字符或字符串。

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

请注意,它会替换所有出现的事件。在您当前的代码中,您将使用相同的随机生成值替换这两个事件。

两种可能的解决方案:

  • 将原始字符串分成两部分:替换第一个中的值,然后替换第二个中的值:然后再次连接两者。
  • 将第一个 {Day} 参数重命名为 {Day0};第二个到 {Day1}。然后为每个生成一个随机值。
于 2013-05-21T21:22:23.623 回答