ローカル横串検索で正規表現

以前、デスクトップ上にあるファイルを"横串検索"するスニペットでfunction yokogushiを作成しているが、カレントディレクトリのファイルを対象とした検索を"yokogushi キーワード"で瞬時に総覧するので、よく活用している。

function yokogushi

function yokogushi {
    param(
        $A
    )
    Get-ChildItem -Path "." -Recurse -File | Select-String $A
}
  • yokogushi 検索で実行

    yokogushi 検索で実行

公式APIを見るとわかるが検索を行うSelect-Stringには-Patternのオプションが備わるため正規表現をそのまま使える。たとえば"検索サーバ"、"検索画面"のどちらかにマッチさせようと

yokogushi '検索.*(サーバ|画面)'

と指定すると下記のようにマッチする。

  • 検索サーバと検索画面がマッチ

    検索サーバと検索画面がマッチ

任意の一文字を表す「.」と0回以上の連続を表す「*」でサーバor画面のどちらかで終わる文字列を(サーバ|画面)で指定・・・と正規表現でよくある説明だが、どうマッチするかを明確に指定するのは実際、非常に難しい。常に触らないとこのスキルは上達しそうにない。

特定の形式が並ぶログデータがあれば、それに合わせて探りながらマッチすると理解が深まる。たとえば、筆者の環境には、気象情報が西暦で並ぶログがあるので

yokogushi '^\d{4}-08-\d{2}'

とすると、下図のようにマッチする。

  • yokogushi '^\d{4}-08-\d{2}'で気象ログマッチ

    yokogushi '^\d{4}-08-\d{2}'で気象ログマッチ

筆者の環境では、上記のログに対応する形だけを指定する関数を作って設定しておけば、それだけで即座に特定気象データを一覧表示できるようになる。活躍頻度は高くなるので、効果的に正規表現を体験する機会も多くなる。

正規表現練習ツールを作成してみる

検索してみるとわかるが正規表現練習サイトや高機能な練習ソフトなどもあり、正規表現の書籍もある。データがあるところには深い検索機能が必要になってくる。古くからプログラミング言語には実装されてきたが比較的最近になってExcel関数にに正規表現が加わる(記事)など、身につけておきたいスキルのひとつともいえる。

これらを手軽に試せるいわば"ドリル"を限られたPowerShell環境で構築してみたいと思った。PowerShellでは正規表現でマッチするオブジェクトを保有する.NETのMatchオブジェクトを使える。

function drill {
    param($Text, $Pattern)

    $result = $Text | Select-String $Pattern
    $result.Matches
}
  • Select-Stringに正規表現を入力すると返るMatchオブジェクト

    Select-Stringに正規表現を入力すると返るMatchオブジェクト

Valueにマッチした文字が格納されているのでそれを表示させる。

function drill {
    param($Text, $Pattern)

    $result = $Text | Select-String $Pattern
    $result.Matches.Value
}

  • マッチした文字が表示される

    マッチした文字が表示される

マッチしない場合に何も表示されないとわかりにくいので、ifを差し込み定型の文字を返すようにしておく。以下の関数を、PowerShell上のnotepad $PROFILEで開くプロファイルに記載して、 .$PROFILEで反映させる。

function drill

function drill {
    param($Text, $Pattern)

    $result = $Text | Select-String $Pattern

    if (-not $result) {
        "No matches(ハズレ)"
        return
    }

    $result.Matches.Value
}

  • 一つ目パラメータに演習用文字列、二つ目のパラメータに正規表現を入れて、マッチしないとハズレ表示

    一つ目パラメータに演習用文字列、二つ目のパラメータに正規表現を入れて、マッチしないとハズレ表示

こうしておけば、ちょっと空いた時間に本やWebにある正規表現の例を試しながらハンズオンできる。やはり習慣化するには手元で遊ぶに限る。得点をつけたり、マッチ部分に色を付けたりもできそうだが、今回はこれでいいだろう。そう思うた。