我收到了一个包含正则表达式模式的输入字符串,我需要随机生成与该模式匹配的字符串。我不知道是否需要逐个解析正则表达式字符串并为每个部分使用随机生成器,或者是否有一个具有此功能的类可用。
例如: 输入字符串 =“[0-9] [A-Z]” 可能的输出=“1A”,“9B”等。
例如: 输入字符串 =“[0-9] [A-Z]” 可能的输出=“1A”,“9B”等。
我没有测试过它,也不知道它如何工作。因此,请自行决定是否使用。我找不到其他易于使用和立即可用的替代方案,这似乎是一个空缺。你会认为会有一些预制类...包括一个.NET版本的Xeger,用于从正则表达式生成随机文本。 Xeger不支持所有有效的Java正则表达式。全部定义在此处,并在(http://code.google.com/p/xeger/wiki/XegerLimitations)中进行了总结。
[..]
"并使用Random生成该字符串的一部分。value
)进行检查,就可以得到一个简单的单元测试。 - Thomas Weller\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 }
};
()
中,以便我们可以匹配它们。// 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
...