假设我想在一个大的(300,000个字母)中找到"狗"这个词,两个字母之间的距离恰好在 40,000个字母之间.所以我这样做:
$mystring =~ m/d.{40000}o.{40000}g.{40000}s/;
Run Code Online (Sandbox Code Playgroud)
这在其他(较慢的)语言中可以很好地工作,但是在Perl中,它会使我"在{,}中的量词大于正则表达式中的32766".
所以:
如果你真的需要这么快,我会根据Boyer-Moore字符串搜索的想法来查看自定义搜索.正则表达式被解析为有限状态机.即使是这种FSM的巧妙,紧凑的表示也不会像你描述的那样执行搜索.
如果你真的想沿着线继续你现在你可以连接两个这样的表达式.{30000}.{10000}是一样.{40000}的做法.
我认为索引可能更适合这项任务.完全未经测试的东西:
sub has_dogs {
my $str = shift;
my $start = 0
while (-1 < (my $pos = index $$str, 'd', $start)) {
no warnings 'uninitialized';
if ( ('o' eq substr($$str, $pos + 40_000, 1)) and
('g' eq substr($$str, $pos + 80_000, 1)) and
('s' eq substr($$str, $pos + 120_000, 1)) ) {
return 1;
}
}
return;
}
Run Code Online (Sandbox Code Playgroud)
40,000 = 2*20,000
/d(?:.{20000}){2}o(?:.{20000}){2}g(?:.{20000}){2}s/s
Run Code Online (Sandbox Code Playgroud)