以Python3的re.findall(r'\w*','a-b')作为演示例证。
首先要明白\w*有两种匹配模式,多字符匹配(贪婪模式)和零字符匹配(懒惰模式)。
现在开始。第一步,NFA正则引擎让\w*去匹配a,匹配成功,findall返回a。接下来马不停蹄匹配-,因为-是非单词字符,匹配……不能说失败,\w*是不承认失败的,一定要成功。于是回溯,再次匹配-,因为上一次的贪婪模式没有配上,这次采用零字符模式,零字符模式自然成功,匹配空字符,返回空字符''。竟然成功了,趁热打铁匹配b,优先应用多字符匹配,成功返回b,最后来到字符末尾$,尾标记$和\w*匹配不上,\w+又一次不承认失败,坚持再次回溯,重新以零字符匹配,再次成功,第二次返回空字符。继续下一次匹配,但这时已经到达字符串末尾后面,整个匹配全部结束,最终findall返回列表['a','','b','']。