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

n7taea2i  于 2023-05-13  发布在  其他
关注(0)|答案(4)|浏览(120)

我已经有了一个生成随机字符串的方法。但是很慢。我想用我不擅长的正则表达式来改进这个方法。
我的代码:

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}");
有没有办法用正则表达式创建一个随机字符串?

vd2z7a6w

vd2z7a6w1#

您可以尝试以下库从模式生成随机字符串: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();
rhfm7lfc

rhfm7lfc2#

我以前试过这个,性能不是很好。Regex是一种方法。我完全支持正则表达式,但在这种意义上使用它是过度工程化的。
用你想要使用的所有字符创建一个数组,然后随机循环,每次抓取一个元素(或一组元素位移),你应该可以开始了。
这里有一个示例程序,你可以复制或细读。我很想知道@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();
        }
    }
}
tez616oj

tez616oj3#

我发现基于Regex模式生成随机字符串的最简单方法是使用RandomDataGenerator.Net NuGet包。你可以在GitHub上找到它:https://github.com/StefH/RandomDataGenerator
在你的例子中,代码看起来像这样:

using RandomDataGenerator.FieldOptions;
using RandomDataGenerator.Randomizers;

public string GetRandomString(string pattern)
{
    if (string.IsNullOrEmpty(pattern))
    {
        throw new ArgumentException("Regex pattern cannot be null or empty.", nameof(pattern));
    }

    var randomizerTextRegex = RandomizerFactory.GetRandomizer(new FieldOptionsTextRegex { Pattern = pattern });

    return randomizerTextRegex.Generate();
}

并使用它像:

var regexPattern = "^[a-zA-Z0-9]{16}";
var randonString = GetRandomString(regexPattern);
u2nhd7ah

u2nhd7ah4#

这总是生成一个随机字符串,虽然它只是一些小的修改上面提到的代码片段.

static char[] charactersAvailable = {'A', '3', '4', 'D', 'E', 'f', 'g', 'h', '5', '6', 'i', 'j', 'k', 'l', 'm', 'n', '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', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
                                         '0', '1', '2', '7', '8', '9', 'B', 'C'};

    public static string GetRandomAlphaNumString(int stringLength)
    {
        StringBuilder randomString = new StringBuilder();
        randomString.Clear();
        for (int i = 0; i < stringLength; i++)
        { 
            string str = GetCurrentTime().Ticks.ToString();
            int randomCharSelected = Convert.ToInt32(str.Substring(16, 1));

            randomString.Append(charactersAvailable[randomCharSelected]);
        }

        return randomString.ToString();
    }
    internal static DateTime GetCurrentTime()
    {
        Thread.Sleep(1);
            DateTime result = DateTime.UtcNow;
            return result;
    }

相关问题