前些天看编译原理,看到了把正则语句的状态机分析,把NFA转换为DFA再进行优化,所以想着能不能反过来用这套分析法去优化正则语句。我试了下【匹配数字】和【/(a*b+)*/
正则语句的优化】。
匹配数字:
结论:加上起止符号,数字匹配的最优写法是/^\d*(.\d+)?$//(a*b+)*/
正则语句的优化:
结论是NFA语法的/(a*b+)*/
可以转换成DFA的/((a|b)*b)?/
但是,/(a*b+)*/
正则语句的优化感觉得到/((a|b)*b)?/
的过程很生硬,不知道应该怎么去解释,正则优化这块有比较好的理论分析方法吗?
我觉得可以这么看,
b+
可以看成b*b
,这样的话a*b*b
就缩成(a|b)*b
。然后
((a|b)*b)*
,外面的贪婪不会比里面的贪婪范围更大,因此保留 0 次和 1 次,就变成了?
大概可以这么去理解吧
===== 补充
说实话写的时候可能根本不会想到这么多,大多是按照直觉和顺序去写。不过也有很多文章说,为了正则的性能,少用或、少用限定、少用组、之类之类的,什么优化最根本是减少回溯,所以少贪婪,就有点儿玄学。