PowerShellで正規表現ドリルを活用、フォルダ検索を効率化する関数「deskmemo2」の実装例
PowerShellの正規表現ドリル関数「deskmemo2」実装例

筆者はPowerShellのプロファイルに正規表現ドリル関数を設置し、暇があればマッチする文字を確認するドリルを実装していた。しかし、その関数と既存のコマンドとの相性が良いことに気づいた。というのも、20260718のような西暦日付フォルダにその日の作業ファイルを保存する習慣があり、この習慣を活用してdirコマンドと*(アスタリスク)を組み合わせたdeskmemoコマンドで日々の作業ファイルや保存ファイルを総覧しているからだ。

正規表現を使ったフォルダ検索の必要性

dirコマンドはアスタリスクを使えるが、正規表現に対応しているわけではない。そこで、せっかく作成した正規表現ドリルを活用し、フォルダ階層を正規表現で検索できるコマンドにしたいと考えた。Where-Objectはすべての.NETオブジェクトを扱えるため、正規表現を使える-match演算子を持っている。

以下がその関数deskmemo2の実装例である。

Pickt横長バナー — Telegram用の共同買い物リストアプリ
function deskmemo2 {param($Pattern)dir -dir | Where-Object { $_.Name -match $Pattern } | % { dir $_ }}

-matchの後の正規表現をパラメータで取得し、dirで表示されるNameを限定。% (Foreachオブジェクト)以降のループで再表示させることが可能だ。

正規表現で正確にフォルダを探し出す

上記の関数を使って、20260821のような8月のフォルダだけを表示するには、正規表現でどう指定すればよいだろうか。意外に難しい。引数で複雑な正規表現を指定する場合、文字列であることを明確に伝えるためにシングルコートで括る必要がある。それを踏まえた上で、数字(\d)4つに08をそのまま繋げてみた。

deskmemo2 '\d{4}08'

deskmemo2 '\d{4}08'の表示結果では、202608と続く8月フォルダはマッチするが、7月の20260708フォルダにもマッチしてしまう。正確に8月のフォルダだけをマッチさせるには、08の後にも数字(\d)2つが続くことを伝える必要がある。

deskmemo2 '\d{4}08\d{2}'

deskmemo2 '\d{4}08\d{2}'での表示結果では、無事に7月の20260708フォルダを外すことができる。

日本語フォルダの検索と応用

.NET公式の正規表現文字クラスのページには、ひらがなやカタカナ、漢字の名前付きブロックが掲載されている。これを指定すると、日本語だけのフォルダを表示させることも可能だ。

deskmemo2 '^[\p{IsHiragana}\p{IsKatakana}\p{IsCJKUnifiedIdeographs}]'

様々な指定方法がある正規表現だが、これで実際のフォルダ名をもとに正規表現の練習も可能になる。実際のファイルやフォルダを探索しながらズバッと意味のあるファイルへマッチする正規表現があれば、それを関数として記しておくのも良いかもしれない。

Pickt記事後バナー — 家族イラスト付きの共同買い物リストアプリ