源码已公布在GitHub上,本来是写了这个功能给记事本提供正则表达式的搜索和替换功能,但是记事本那边暂时有一点点bug所以没放在一起。
如果想知道构造出来的自动机的结构,我写的代码支持用graphviz进行显示。代码里会告诉你怎么画出跟下面一样的图:
接下来我大致讲一下整个代码的结构,而具体的实现请参考GitHub里的代码,关键步骤都打了注释(应该)。
正则表达式转NFA
Thompson算法
Thompson算法是经典的NFA构造算法,以递归方式将正则表达式划分为若干子表达式,得到每个子表达式所对应的子NFA,再根据子表达式之间的运算关系构造完整的NFA。下图为4种基本子表达式(单独、连接、或、Kleene闭包)的NFA构造示例,其中:m1和m2分别表示2个状态机;ε表示空串匹配;s为初始状态;f为接受状态。
正则表达式插入连接符号
因为输入的正则表达式都是长这样子’aabb’,是忽略了连接符号的结果,所以代码中要给他加入连接符号,即变为’a.a.b.b’。