是否有一个类,可以生成一个随机的正则字符串,如果给定的模式
本文关键字:随机 字符串 如果 模式 一个 有一个 是否 | 更新日期: 2023-09-27 18:05:32
我正在接收一个输入字符串,这是一个正则表达式模式,我需要随机生成一个匹配该模式的字符串。我不知道这是否需要逐块解析正则字符串并为每个部分使用随机生成器,或者是否有一个具有此功能的类。
的例子:
输入字符串= "[0-9][A-Z]"
可能输出= "1A", "9B"等
从我能找到的,Xeger是最流行的解决方案,但它是在Java..
然而,显然有一个c#版本:Fare.
如果你读了描述,他们说Xeger部分移植到Fare应用程序,但不是全部。
包含Xeger的. net端口,用于从正则表达式生成随机文本。Xeger并不支持所有有效的Java正则表达式。这里定义了完整的集合,并在(http://code.google.com/p/xeger/wiki/XegerLimitations)中进行了总结。
我还没有测试过它,不知道它是否/如何工作,虽然。所以请自行决定使用。我找不到其他简单的现成的东西,这似乎是一个缺口。你会认为会有一些预先制作的类…
如果你知道你需要这个相对简单的东西,那么我想说你最好自己写一个小的RegexGenerator。它需要解析输入"[..]
"的每个片段,并使用Random
来生成该字符串片段。
如果你可以控制输入,为什么不写一个呢?我把你的两个例子,并增加了'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(); }
}
}
<<p> 占位符映射/strong> 因此,我们设置生成器的占位符可能性如下:
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 }
};
现在我们必须解析用户输入,以确定每个用户输入需要哪些随机文本。
在此之前,我们需要基于所有占位符创建一个正则表达式模式。因此,让我们基于它们生成该模式,但是转义正则表达式特殊字符并将占位符放在匹配括号( )
中,以便我们可以匹配它们。
// Create pattern such as `[A-Z]|[0-9]|'d` but it escapes the regex specials
// to return `('[A-Z])|('[0-9])|(''d)`
var pattern =
string.Join("|", PlaceHolders.Select (ph => Regex.Escape(ph.Pattern))
.Select (pttrn => string.Format("({0})", pttrn)));
生成结果
现在我们解析输入,并将找到的匹配投影到占位符中。一旦我们有了正确的占位符,我们就根据它生成随机文本。
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
...
这是基于我的博客文章c#:从用户定义的模式和字符生成数字和字母的随机序列«OmegaMan的沉思,我将不得不更新这个场景。