如果我有一个任意的正则表达式,如何生成符合(或不符合)给定正则表达式的随机文本序列?我对理论和实际用途都感兴趣(需要在.NET上进行测试),因此希望提供文章或现有库的链接。
如果我有一个任意的正则表达式,如何生成符合(或不符合)给定正则表达式的随机文本序列?我对理论和实际用途都感兴趣(需要在.NET上进行测试),因此希望提供文章或现有库的链接。
从纯理论角度来看,正则表达式等价于有理语言,其构造基于以下原则:
{}
(不包含任何单词的语言)是有理的。{a}
(只包含一个单词字母的语言)是有理的。L
和M
是两个有理语言,则它们的并集(即L
或M
中的单词)也是有理的。L
和M
是两个有理语言,则它们的连接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*)
从一种角度来看,每个正则表达式可以(我相信)表示为一个有限状态机,在其中,状态之间的每个转换都由消耗一个或多个字符组成(或许也可以是零个字符?自从我学习这个已经很久了)。
因此,解决这个问题的一种方法是将正则表达式想象成或转换成一个有限状态机,并从一个状态移动到另一个状态,在随机选择转换直到到达有效的结束状态。
当然,我不知道这种方法在代码中是否实际可行,或者是否存在任何这样的库。
http://lara.epfl.ch/dokuwiki/equivalence_of_finite_state_machine_and_regular_expression_languages
var xeger = new Xeger(pattern);
var match = xeger.Generate();
Regex.IsMatch(match, pattern);
// Prints -> true