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