パターンに基づいて単純な文字列を生成しようとしています。
私の考えは、正規表現を使用して単純な置換を行うことでした。私は簡単な方法から始めました:
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
ます。
私が持っている2番目の問題は、長さを処理する方法です:
現時点では、必要なすべての桁を指定する必要がありますが、指定して同じ出力を取得[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
。