迅速なテキスト処理のためのPerl REGEXPの例

コマンドラインとの通信を容易にする非常に便利なレシピをここで説明しますが 、実際に試すことができませんでした。 私のシステム(OpenIndiana)では、Go言語コンパイラはありません。 そのため、指定されたプログラムを、あらゆるプラットフォームに確実に存在するより普遍的な言語、Perlに書き直すというアイデアが生まれました。



結果のコード例を使用して、正規表現を使用して数行を使用して、迅速かつ効率的な検索を実行する方法を示したいと思います。



実装



まず、渡されたヒント関数を将来の正規表現の一部に変換します。



$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



All Articles