生成与给定正则表达式匹配的随机序列。

4

如果我有一个任意的正则表达式,如何生成符合(或不符合)给定正则表达式的随机文本序列?我对理论和实际用途都感兴趣(需要在.NET上进行测试),因此希望提供文章或现有库的链接。


4
我不知道是否有适用于.NET的库,但你可以尝试在 StackOverflow 上搜索 "xeger";这可能会给你一些指引。 xeger 是一个 Java 库,用于根据给定的正则表达式生成字符串。 - Tim Pietzcker
5个回答

3

从纯理论角度来看,正则表达式等价于有理语言,其构造基于以下原则:

  • {} (不包含任何单词的语言)是有理的。
  • {a}(只包含一个单词字母的语言)是有理的。
  • 如果LM是两个有理语言,则它们的并集(即LM中的单词)也是有理的。
  • 如果LM是两个有理语言,则它们的连接LM(通过在L之前添加来自M的单词构建的单词)也是有理的。
  • 如果L是一个有理语言,则L*(通过连接来自语言L的任意数量单词构建的单词)也是有理的。

这种构造方法补充了正则表达式识别/匹配方法,并帮助递归地构建与表达式匹配的单词:

  • make({}) = ""
  • make({a}) = "a"
  • make(A|B) = 抛硬币 ? make(A) : make(B)
  • make(AB) = make(A) + make(B)
  • make(A*) = 抛硬币 ? "" : make(A) + make(A*)

1

从一种角度来看,每个正则表达式可以(我相信)表示为一个有限状态机,在其中,状态之间的每个转换都由消耗一个或多个字符组成(或许也可以是零个字符?自从我学习这个已经很久了)。

因此,解决这个问题的一种方法是将正则表达式想象成或转换成一个有限状态机,并从一个状态移动到另一个状态,在随机选择转换直到到达有效的结束状态。

当然,我不知道这种方法在代码中是否实际可行,或者是否存在任何这样的库。

http://lara.epfl.ch/dokuwiki/equivalence_of_finite_state_machine_and_regular_expression_languages



1
在.NET中,您可能还想查看项目Fare。它正好做你所描述的事情。
以下是如何使用它:
var xeger = new Xeger(pattern);
var match = xeger.Generate();

Regex.IsMatch(match, pattern);
// Prints -> true

由于您提到了单元测试,您可能还可以考虑使用AutoFixture。一旦您使用[RegularExpression]属性装饰一个属性(或字段),它将分配与正则表达式匹配的值。

0

虽然不是 .NET,但可能很有趣。在 Haskell 中发现了 这个实现。作者声称它比 CPAN Genex 更强大。


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