为什么前瞻(有时)比捕获更快?

mpe*_*mpe 7 regex perl lookahead

这个问题的灵感来自另一个问题.

相比s/,(\d)/$1/s/,(?=\d)//:前者使用一个捕获组只更换数字而不是逗号,后者采用的是向前看,以确定是否逗号是一个数字得手.为什么后者有时会更快,如本回答所述

Mic*_*man 4

这两种方法做不同的事情并且有不同类型的管理成本。当您捕获时,perl 必须复制捕获的文本。前瞻匹配,无需消耗;它必须标记它开始的位置。您可以使用re 'debug'pragma 查看发生了什么:

use re 'debug';
my $capture = qr/,(\d)/;
Run Code Online (Sandbox Code Playgroud)
编译 REx ",(\d)"
最终计划:
   1:准确 (3)
   3:打开1 (5)
   5:数字 (6)
   6:关闭1 (8)
   8:结束(0)
锚定“,”在 0(检查锚定) minlen 2
释放 REx: ",(\d)"
use re 'debug';
my $lookahead = qr/,(?=\d)/;
Run Code Online (Sandbox Code Playgroud)
编译 REx ",(?=\d)"
最终计划:
   1:准确 (3)
   3:IFMATCH[0] (8)
   5:数字 (6)
   6: 成功 (0)
   7:尾巴 (8)
   8:结束(0)
锚定“,”在 0(检查锚定) minlen 1
释放 REx: ",(?=\d)"

在大多数情况下,我希望前瞻比捕获更快,但正如其他线程正则表达式中所述,性能可能取决于数据。