Perl:"在{,}中的量词大于正则表达式中的32766"

Gad*_*i A 6 regex perl

假设我想在一个大的(300,000个字母)中找到"狗"这个词,两个字母之间的距离恰好在 40,000个字母之间.所以我这样做:

$mystring =~ m/d.{40000}o.{40000}g.{40000}s/;
Run Code Online (Sandbox Code Playgroud)

这在其他(较慢的)语言中可以很好地工作,但是在Perl中,它会使我"在{,}中的量词大于正则表达式中的32766".

所以:

  1. 我们能以某种方式使用更大的数字作为量词吗?
  2. 如果没有,还有另一种找到我想要的好方法吗?请注意,"狗"只是一个例子; 我想为任何单词和任何跳转大小(和快速)执行此操作.

Ben*_*son 9

如果你真的需要这么快,我会根据Boyer-Moore字符串搜索的想法来查看自定义搜索.正则表达式被解析为有限状态机.即使是这种FSM的巧妙,紧凑的表示也不会像你描述的那样执行搜索.

如果你真的想沿着线继续你现在你可以连接两个这样的表达式.{30000}.{10000}是一样.{40000}的做法.


Sin*_*nür 5

我认为索引可能更适合这项任务.完全未经测试的东西:

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)


ike*_*ami 5

40,000 = 2*20,000

/d(?:.{20000}){2}o(?:.{20000}){2}g(?:.{20000}){2}s/s
Run Code Online (Sandbox Code Playgroud)