我已经有一种生成随机字符串的方法。但它很慢。我想使用我不擅长的正则表达式改进方法。
我的代码:
public string GetRandomString()
{
var random = new Random();
string id = new string(Enumerable.Repeat("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", 16)
.Select(s => s[random.Next(s.Length)]).ToArray());
return id;
}
通过使用正则表达式,我可以轻松地将字符串:abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
压缩为某些字符。就像:
var regex = new Regex(@"[\w\d]{16}");
有没有办法用正则表达式创建随机字符串?
答案 0 :(得分:9)
您可以尝试使用以下库从模式生成随机字符串: https://github.com/moodmosaic/Fare
var xeger = new Xeger(pattern);
var generatedString = xeger.Generate();
其次,为什么要使用Enumerate.Repeat生成字符串?你为什么不把它保存在字符串或缓存中呢?重复16次有什么意义?我想你会在每个方法调用时生成这个字符串,这就是为什么它很慢。在我看来,由于代码生成的字符串,字符串实习在您的代码中不起作用。 怎么样这样做:
string dictionaryString = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
StringBuilder resultStringBuilder = new StringBuilder();
for (int i=0;i<desiredLength;i++)
{
resultStringBuilder.Append(dictionaryString[random.Next(dictionary.Length)]);
}
return resultStringBuilder.ToString();
答案 1 :(得分:1)
我以前尝过这个,表现并不是那么好。正则表达式是一种方法。我都是正则表达式,但在这个意义上使用它是过度工程。
创建一个包含你想要使用的所有字符的数组,然后随机循环遍历它,一次抓取一个元素(或一个元素位移的组),你应该好好去。
这是一个示例程序,您可以复制或仔细阅读。我很想知道@Access Denied的回答和这个小家伙之间的性能差异。请原谅缺乏优雅,但是如果其他人偶然发现这一点,我就会明确。
using System;
using System.Text;
namespace RandomString
{
class Program
{
static void Main()
{
Console.WriteLine("My new random alphanumeric string is {0}", GetRandomAlphaNumString(12));
Console.WriteLine("\nPress any key to exit...");
Console.ReadKey(true);
}
static char[] charactersAvailable = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
public static string GetRandomAlphaNumString(uint stringLength)
{
StringBuilder randomString = new StringBuilder();
Random randomCharacter = new Random();
for (uint i = 0; i < stringLength; i++)
{
int randomCharSelected = randomCharacter.Next(0, (charactersAvailable.Length - 1));
randomString.Append(charactersAvailable[randomCharSelected]);
}
return randomString.ToString();
}
}
}