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

4
我收到了一个包含正则表达式模式的输入字符串,我需要随机生成与该模式匹配的字符串。我不知道是否需要逐个解析正则表达式字符串并为每个部分使用随机生成器,或者是否有一个具有此功能的类可用。
例如: 输入字符串 =“[0-9] [A-Z]” 可能的输出=“1A”,“9B”等。

有一个非常有用的库(xeger),但它是用Java编写的。 - Matias Cicero
1
请在提问前先进行谷歌搜索。 - djechlin
好的,您可以将每个模式表示为一个图,然后随机遍历它。在SO上找到库是不相关的话题。 - Mitch
不是重复内容,我搜索了C#的示例但没有找到。 - Pipeline
在SO上也可以找到一个C#的答案。 - djechlin
2
那么链接怎么样?哈哈,你的评论毫无意义,这个问题有很多适用于C#的情况。 - Pipeline
2个回答

3
据我所知,Xeger是最受欢迎的解决方案,但它是用Java编写的。
然而,显然有一个C#版本:Fare。如果你阅读描述,他们说Xeger部分地移植到了Fare应用程序中,但不是完全移植。

包括一个.NET版本的Xeger,用于从正则表达式生成随机文本。 Xeger不支持所有有效的Java正则表达式。全部定义在此处,并在(http://code.google.com/p/xeger/wiki/XegerLimitations)中进行了总结。

我没有测试过它,也不知道它如何工作。因此,请自行决定是否使用。我找不到其他易于使用和立即可用的替代方案,这似乎是一个空缺。你会认为会有一些预制类...
如果你知道你需要这个功能来完成相对简单的任务,那么我建议你最好编写自己的小RegexGenerator。这需要你解析每个输入块"[..]"并使用Random生成该字符串的一部分。

var xeger = new Xeger(value); var result = Regex.IsMatch(xeger.Generate(), value);这是如何工作的?result 是一个布尔值,我不确定新生成的字符串现在存储在 xeger 中的哪里? - Pipeline
@Pipeline:xeger.Generate() 会生成随机字符串。将其与模式(value)进行检查,就可以得到一个简单的单元测试。 - Thomas Weller

2
如果你可以控制输入,为什么不自己写一个呢?我已经拿了你的两个例子并添加了\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
 ...

这是基于我的博客文章C#: Generate a Random Sequence of Numbers and Letters From a User Defined Pattern and Characters « OmegaMan's Musings的大致内容,我将不得不更新此场景。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接