【发布时间】:2013-01-02 00:27:46
【问题描述】:
我正在尝试基于模式进行简单的字符串生成。
我的想法是使用正则表达式进行简单的替换。
我从简单的方法开始:
private static string parseTemplate(string template)
{
return Regex.Replace(template, @"(\[d)((:)?([\d]+)?)\]", RandomDigit());
}
private static string RandomDigit()
{
Random r = new Random();
return r.Next(0, 9).ToString();
}
现在这样做是将[d]、[d:3] 等组替换为应该是随机数字的组。
不幸的是,每个组都被替换为相同的数字,例如,如果我输入 test [d][d][d:3],我的方法将返回 test 222。
我想在每个地方得到不同的数字,比如test 361。
我遇到的第二个问题是处理长度的方法:
现在我必须为我想要的每个数字指定[d],但指定[d:3] 并获得相同的输出会更容易。
我知道有一个名为Fare 的项目,但我想在没有这个库的情况下这样做
目前我只搜索[d],但是这种方法是否可以正常工作,添加其他组不会有问题,例如:[s] 用于特殊字符或任何其他类型的模式。
编辑1
正如建议的那样,我将 Random 更改为静态变量,如下所示:
private static string parseTemplate(string template)
{
return Regex.Replace(template, @"(\[d)((:)?([\d]+)?)\]", RandomDigit());
}
private static Random r = new Random();
private static string RandomDigit()
{
return r.Next(0, 9).ToString();
}
问题是当我这样调用我的代码时:
Console.WriteLine(parseTemplate("test [d:2][d:][d]"));
Console.WriteLine(parseTemplate("test [d:2][d:][d]"));
我得到这样的输出
test 222
test 555
我想要这样的输出(例如):
test 265
test 962
我认为问题出在Regex.Replace 上,它只调用了我的RandomDigit 一次。
【问题讨论】:
-
这是您使用 Random 类的问题,您需要使用不同的种子对其进行初始化,或者在调用之间等待一段时间以确保它返回不同的值。
-
查看answer。
-
静态随机在这里不是问题:) 我在我的问题中添加了一些代码。 Regex.Replace 似乎只调用了一次我的随机方法。