我有一个字符串“{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天替换中的日子是相同的。
答案 0 :(得分:5)
将Regex.Replace
与MatchEvaluator
委托人一起使用:
string text = "{Day} - is a victory day. {Day} - is my birthday";
text = Regex.Replace(text, @"\{Day\}", m => xNet.Rand.Next(1, 30).ToString());
答案 1 :(得分:1)
String.Replace
将字符串作为"替换为"参数并替换所有出现的事件。例如,在您的情况下,Rand可能会生成字符串19
一次,然后将其传递给Replace并替换所有出现的{Day}
。
如果您希望它为每个匹配生成一个新的替换,您可以使用Regex.Replace
代替,它可以采用每个匹配调用一次的函数/ lambda来生成替换字符串;
text = Regex.Replace(text, Regex.Escape("{Day}"),
match => xNet.Rand.Next(1,30).ToString());
答案 2 :(得分: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);
}
未经测试,但这应该为您提供解决方法的线索。
答案 3 :(得分:0)
根据相关的(String.Replace)MSDN条目:
返回一个新字符串,其中指定了所有出现次数 当前字符串中的Unicode字符或字符串将替换为 另一个指定的Unicode字符或字符串。
http://msdn.microsoft.com/en-us/library/system.string.replace.aspx
请注意,它会替换所有出现。在当前代码中,您将使用相同的随机生成值替换两个出现的事件。
两种可能的解决方案:
答案 4 :(得分: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();
}
答案 5 :(得分:0)
这可能不是您尝试做的最佳方式...但是您至少需要了解您只调用text.Replace()
方法一次,并且它按预期工作。 I.E.用方法生成的数字替换{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());