結果のコード例を使用して、正規表現を使用して数行を使用して、迅速かつ効率的な検索を実行する方法を示したいと思います。
実装
まず、渡されたヒント関数を将来の正規表現の一部に変換します。
$hints =~ s/(.)/$1\.\*\?/g;
ここで、$ヒントは、すべてのヒントから接着された文字列です(例: 'abcd')。
検索式(。)は単一の文字(それぞれ、検索パラメーター 'g'が与えられる)であるため、それを自分自身($ 1-検索式の最初の括弧からの値)で置き換え、必要な部分を追加します。
各文字の後に、「。*?」というブロックを追加します。これは、任意の文字、0回以上、および修飾子を「貪欲ではない」ようにするマーカー(これについては以下で説明します)。
合計出力は、「a。*?B. *?C. *?D. *?」という行です。
メインパーツに渡します。メインパーツは、 "馴染みのある"フォルダーの文字列とヒントの条件を比較します。
if ($path =~ /^(.*)($hints)$/)
ここで、記号「^」は行の先頭の「アンカー」、最初の括弧内の式「(。*)」は行接頭辞です。この式の後-検索のヒントを含む事前に準備された正規表現、式は2番目の「アンカー」で終了します- 「$」は、行末に一致することを意味します。
最初の行を除く行のすべての修飾子「*」にはマーカー「?」が含まれているため、このマーカーがない唯一の修飾子は「貪欲」になります。 できるだけ多くの行を削除しようとしています。
この例では、出力に変換された文字列があります:/^(.*)(a.*?b.*?c.*?d.*?)$/
実際、この場合の検索は右から左に実行されます。 最初に、行の最後から最も近い文字「d」を探し、次にその左に、最も近い文字「c」、次にその左に最も近い文字「b」、次にそれに最も近い文字「a」を探します。すべてが見つかった文字の左になります「a」は「貪欲な」プレフィックスに分類されます。 行内で見つかった結果の位置は、このプレフィックスの長さ、つまり行
$w = length($1);
によって決まり
$w = length($1);
(ここで、$ 1は前の正規表現の最初の括弧から値を取得します)、残りの条件(右側の方が良い)は、正規表現によって既に満たされています。
関数LoadPathsを追加し、起動パラメーターの処理を追加して終了するだけです。
完全なスクリプト:
hg clone bitbucket.org/eugenet/perlre