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

时间:2015-07-30 18:22:40

标签: c# regex string

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

示例:

  

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

     

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

2 个答案:

答案 0 :(得分:3)

根据我的发现,EPPlus是最受欢迎的解决方案,但它是在Java中。

但是,显然有一个C#版本:Xeger 如果您阅读说明,他们会说Xeger部分移植到票价申请中,但不完全。

  

包含Xeger的.NET端口,用于从正则表达式生成随机文本。 Xeger不支持所有有效的Java正则表达式。这里定义的全套内容汇总在(Fare)。

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

如果你知道你需要这个相对简单的东西,那么我说你最好自己写一个小的RegexGenerator。它确实需要你解析每一个输入" [..]"并使用Random生成该字符串。

答案 1 :(得分: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)));

生成结果

现在我们解析输入,项目找到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))

实际结果

 1X
 0B
 ...

这是基于我的博客文章C#: Generate a Random Sequence of Numbers and Letters From a User Defined Pattern and Characters « OmegaMan's Musings的基础,我将不得不使用此方案进行更新。