Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果给定模式,是否有一个类可以生成随机正则表达式字符串?_C#_Regex_String - Fatal编程技术网

C# 如果给定模式,是否有一个类可以生成随机正则表达式字符串?

C# 如果给定模式,是否有一个类可以生成随机正则表达式字符串?,c#,regex,string,C#,Regex,String,我收到一个输入字符串,它是一个正则表达式模式,我需要随机生成一个与该模式匹配的字符串。我不知道这是否需要通过正则表达式字符串逐段进行解析,并为每个部分使用随机生成器,或者是否有一个类具有这种现成的功能 例如: 输入字符串=“[0-9][A-Z]” 可能的输出=“1A”、“9B”等 据我所知,这是最流行的解决方案,但它是用Java实现的 然而,显然有一个C版本:。 如果您阅读了描述,他们说Xeger部分地被移植到了Fare应用程序中,但不是全部 包括Xeger的.NET端口,用于从正则表达式生成随

我收到一个输入字符串,它是一个正则表达式模式,我需要随机生成一个与该模式匹配的字符串。我不知道这是否需要通过正则表达式字符串逐段进行解析,并为每个部分使用随机生成器,或者是否有一个类具有这种现成的功能

例如:

输入字符串=“[0-9][A-Z]”

可能的输出=“1A”、“9B”等

据我所知,这是最流行的解决方案,但它是用Java实现的

然而,显然有一个C版本:。
如果您阅读了描述,他们说Xeger部分地被移植到了Fare应用程序中,但不是全部

包括Xeger的.NET端口,用于从正则表达式生成随机文本。Xeger不支持所有有效的Java正则表达式。此处定义的完整内容集,总结于()

不过,我还没有测试过它,也不知道它是否/如何工作。因此,请自行决定使用。我找不到任何其他的容易的和准备好的,这似乎是一个差距。你会认为会有一些预先制作的课程


如果你知道你需要一些相对简单的东西,那么我会说你最好编写你自己的小RegexGenerator。它确实需要您解析每一段输入“
[…]
”并使用
随机
”来生成该段字符串

如果可以控制输入,为什么不写一个?我举了你的两个例子,并添加了
\d
作为一个选项。你必须计算出只有你知道用户才会提供的所有组合


用户输入

假设用户有:

var input = "[0-9][A-Z]";
这是两个替换占位符字符,一个表示数字,一个表示大写字母

占位符

因此,让我们创建一个占位符类,负责保存每个项目,但它也负责生成一个随机字符。这是设计好的课程

public class PlaceHolder
{
    public Random RND { get; set; } // Supplied random number generator

    public string Pattern { get; set; } // User Pattern
    public string Characters { get; set; } // Characters available to use
    public string ReplaceChar              // Generated random character based on pattern.
    {
        get { return Characters[RND.Next( Characters.Length )].ToString(); }
    }
}
占位符映射

因此,我们将生成器的占位符可能性设置为:

Random rn = new Random();
var PlaceHolders = new List<PlaceHolder>()
{
 new PlaceHolder() { Pattern = "[A-Z]", Characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ",  RND=rn },
 new PlaceHolder() { Pattern = "[0-9]", Characters = "0123456789", RND=rn  },
 new PlaceHolder() { Pattern =  @"\d",  Characters = "0123456789", RND=rn  }
};
生成结果

现在,我们解析输入,并将找到的匹配项投影到Placehoders。一旦我们有了正确的占位符,我们就会根据它生成随机文本

string.Join(string.Empty, 
            Regex.Matches(input, pattern)
                 .OfType<Match>()
                 .Select (mt => PlaceHolders.Find(ph => ph.Pattern == mt.Groups[0].Value) )
                 .Select (plc => plc.ReplaceChar))


这是松散地基于我的博客文章,我将不得不更新这个场景

有一个非常有用的库(),但它是用Java编写的。请在询问之前搜索。好的,您可以将每个模式表示为一个图形,然后随机遍历它。不过,寻找一个库并不是我的主题,我搜索了一个c#示例,但没有找到关于链接而不是注释的任何信息?哈哈,你所有的评论都一事无成,这个问题有很多例子都适用于c#var xeger=new xeger(value);var result=Regex.IsMatch(xeger.Generate(),value);这到底是怎么回事?结果是一个布尔值,我不确定新生成的字符串现在在xeger中的位置?@Pipeline:xeger.Generate()生成随机字符串。对照模式(
)检查它使其成为一个简单的单元测试。
string.Join(string.Empty, 
            Regex.Matches(input, pattern)
                 .OfType<Match>()
                 .Select (mt => PlaceHolders.Find(ph => ph.Pattern == mt.Groups[0].Value) )
                 .Select (plc => plc.ReplaceChar))
 1X
 0B
 ...