正则表达式 固化分组

2022-08-28 19:43:09 浏览数 (1)

正则表达式的量词默认是匹配优先,它会尽可能匹配更多的字符,比如.*会匹配一整行。正则表达式会在匹配字符的过程中保存状态,方便在匹配失败的时候进行回溯。

如下,用正则表达式.*bcdef匹配字符串abcdef的过程是:.*先匹配了所有的字符,在每个字符处都保存了状态,匹配失败后进行回溯,.*一步步退回之前保存的状态,直到.*匹配a为止。

代码语言:perl复制
$content = "abcdef";
$content =~ s/.*bcdef//g;

正则表达式保存状态的特性是能够成功匹配的前提。但在一些情况下状态是没有必要保存的,这个时候如果匹配最终会失败,取消保存状态可以加速匹配失败的过程(没有回溯过程)。

比如正则表达式w :,字符串abcdef,由于字符串没有:,匹配最终会失败,匹配过程为:w 先匹配所有字符,:匹配失败,w 进行多次回溯,匹配:一直失败,回溯了5次,最终匹配失败。

从逻辑上分析w :,很容易知道,如果表达式匹配失败,回溯是一定会失败的,因为w 回溯的字符肯定不是:。所以如果能够取消保存状态,正则表达式会更快。

固化分组

固化分组是不保存状态的匹配,上述正则表达式用固化分组表达式为(?>w ):,这样位于括号中的内容就不会保存状态了。

0 人点赞