具有任意正则表达式如何生成匹配(或不匹配)给定正则表达式的随机文本序列?我对理论和实际应用感兴趣(需要在.NET的上下文中改进我的测试),所以可以理解文章或现有库的链接。
答案 0 :(得分:3)
从纯粹的理论角度来看,正则表达式等同于理性语言,它们是在以下基础上构建的:
{}
(一种没有语言的语言)是理性的。{a}
(一种单字一字的语言)是理性的。 L
和M
是两种理性语言,那么他们的联合(L
或M
中的字词)就是理性的。L
和M
是两种理性语言,那么它们的连接LM
(通过将L
中的单词添加到来自M
的单词构建的单词)也是理性的。 L
是一种理性语言,那么L*
(通过连接来自语言L
的任意数量的单词构建的单词)也是合理的。这种建设性方法补充了正则表达式识别/匹配方法,并有助于构造与表达式匹配的递归单词:
make({}) = ""
make({a}) = "a"
make(A|B) = flip-coin ? make(A) : make(B)
make(AB) = make(A) + make(B)
make(A*) = flip-coin ? "" : make(A) + make(A*)
答案 1 :(得分:1)
一种看待它的方法是每个正则表达式都可以(我相信)表示为一个有限状态机,其中状态之间的每个转换包括消耗一个或多个字符(或者可能是零个字符也有效?长时间自从我研究过这个。)
因此,解决这个问题的一种方法是考虑或将正则表达式转换为有限状态机并从状态移动到状态,随机选择转换直到达到有效的结束状态。
当然,我不知道这个方法在代码中的实际可行性,或者是否存在任何这样的库。
http://lara.epfl.ch/dokuwiki/equivalence_of_finite_state_machine_and_regular_expression_languages
答案 2 :(得分:1)
在.NET中,您可能还想查看项目Fare。它完全符合您的描述。
以下是如何使用它:
var xeger = new Xeger(pattern);
var match = xeger.Generate();
Regex.IsMatch(match, pattern);
// Prints -> true
由于您提到了单元测试,您也可以考虑使用AutoFixture,一旦您使用[RegularExpression]属性修饰属性(或字段),它将分配一个与正则表达式匹配的值。
答案 3 :(得分:1)
答案 4 :(得分:0)
虽然不是.NET但可能很有趣。找到this implementation in Haskell。作者声称它比CPAN Genex更强大。