使用正则表达式生成随机字符串

时间:2015-11-26 05:17:04

标签: c# regex

我已经有一种生成随机字符串的方法。但它很慢。我想使用我不擅长的正则表达式改进方法。

我的代码:

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}");

有没有办法用正则表达式创建随机字符串?

2 个答案:

答案 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();
        }
    }
}