6

大きな(300,000文字)単語「犬」を、文字間の距離がちょうど40,000文字の間にあるものを見つけたいとしましょう。私もです:

$mystring =~ m/d.{40000}o.{40000}g.{40000}s/;

これは他の(遅い)言語では非常にうまく機能しますが、Perlでは「正規表現の32766より大きい{、}の数量詞」がスローされます。

それで:

  1. どういうわけか、より大きな数を数量詞として使用できますか?
  2. そうでない場合、私が欲しいものを見つけるための別の良い方法はありますか?「犬」は単なる例であることに注意してください。私はこれをあらゆる単語とあらゆるジャンプサイズ(そして高速)に対して実行したいと思います。
4

3 に答える 3

9

これを本当に速く行う必要がある場合は、ボイヤームーア文字列検索のアイデアに基づいたカスタム検索を検討します。正規表現は、有限状態マシンに解析されます。そのようなFSMの巧妙でコンパクトな表現でさえ、あなたが説明するような検索を実行するための非常に効果的な方法にはなりません。

本当に線に沿って続行したい場合は、実際.{30000}.{10000}と同じように2つの式を連結することができます.{40000}

于 2012-05-16T19:46:56.063 に答える
5

40,000 = 2 * 20,000

/d(?:.{20000}){2}o(?:.{20000}){2}g(?:.{20000}){2}s/s
于 2012-05-16T20:57:57.587 に答える
5

このタスクにはindexの方が適していると思います。完全にテストされていない線に沿ったもの:

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;
 }
于 2012-05-16T20:07:47.667 に答える