正则表达式的量词默认是匹配优先,它会尽可能匹配更多的字符,比如.*
会匹配一整行。正则表达式会在匹配字符的过程中保存状态,方便在匹配失败的时候进行回溯。
如下,用正则表达式.*bcdef
匹配字符串abcdef
的过程是:.*
先匹配了所有的字符,在每个字符处都保存了状态,匹配失败后进行回溯,.*
一步步退回之前保存的状态,直到.*
匹配a
为止。
$content = "abcdef";
$content =~ s/.*bcdef//g;
正则表达式保存状态的特性是能够成功匹配的前提。但在一些情况下状态是没有必要保存的,这个时候如果匹配最终会失败,取消保存状态可以加速匹配失败的过程(没有回溯过程)。
比如正则表达式w :
,字符串abcdef
,由于字符串没有:
,匹配最终会失败,匹配过程为:w
先匹配所有字符,:
匹配失败,w
进行多次回溯,匹配:
一直失败,回溯了5次,最终匹配失败。
从逻辑上分析w :
,很容易知道,如果表达式匹配失败,回溯是一定会失败的,因为w
回溯的字符肯定不是:
。所以如果能够取消保存状态,正则表达式会更快。
固化分组
固化分组是不保存状态的匹配,上述正则表达式用固化分组表达式为(?>w ):
,这样位于括号中的内容就不会保存状态了。