正则表达式总结

DFA和NFA

DFA和NFA反映了正则表达式在应用算法上的根本差异,NFA为表达式主导,DFA为文本主导,有什么区别呢?

  • 表达式主导:

    如用正则表达式:to(nite|knite|night) 来匹配文本:tonight,正则表达式中第一个是‘t’,他会重复尝试,知道在匹配文本中找到‘t’为止,之后检查后续文本是否匹配‘o’,如果能,会接着检查选择分支,引擎会依次尝试‘nite’,‘knite’,‘night’这三种可能,直到匹配成功或全部尝试完后匹配失败,在匹配‘nite’时,会想上面一样一次匹配‘n’,‘i’,‘t’,‘e’,如果失败,在尝试另一种可能。表达式中的控制权在不同的元素之间转换,所以称之为“表达式主导”。

  • 文本主导:

    DFA引擎在扫描字符串时,会记录当前有效的所有可能匹配,如上例中,当扫描到匹配文本的‘i’字符时,它会记录下两个可能匹配的位置‘nite’中的‘i’和‘night’中的‘ni’,从而把knight淘汰,再扫描匹配文本中的‘g’,这时只有‘night’能匹配,只剩下一种可能,然后依次匹配‘h’和‘t’,引擎发现匹配已经完成,报告成功。它是扫描的字符串中的每个字符都对引擎进行了控制,所以称为“文本主导”。

NFA效率会低于DFA,因为DFA每个字符只会扫描一次,而NFA对同一字符会扫描多次。