浅谈正则表达式
状态机可以分为确定性有穷状态机DFA和非确定性有穷状态机NFA。NFA可以经过一系列变化转换为DFA。每一个正则表达式都可以用一个等价的状态机来表示。
正则表达式的引擎有两种实现算法,一种是先处理正则表达式等价的状态机,全转换成DFA,再跟字符串比较、匹配,一种是不处理正则表达式,直接用字符串比较、匹配。
DFA类型的经过了一定的简化,所以不涉及到回溯、向前引用等,而不处理的会多次回溯,一定复杂度之前两者性能相近,但复杂度达到一定程度之后DFA类引擎的效率仍保持线性,NFA则呈现指数变化。
然而由于一些历史原因,现在Perl、Java等语言的正则表达式引擎都是指数变化的那种。为了应对这种让人不愉快的现实,提高使用正则表达式的效率,应当避免写出多次回溯的正则表达式。
类似于方言,正则表达式在不同语言环境下的具体表现有细微差别,比如是否支持某些语法等,这些细微差别给跨语言使用者带来一些不方便。
本执经历涉猎有限,只打算讨论Java、Python和cmd里面的应用跟区别。