dirに正規表現

正規表現ドリル機能をPowerShellプロファイルの関数に設置し、暇があればマッチする文字を確認するドリルを実装した筆者であったが、さわっていると関数化したコマンドとの相性が良いことにすぐ気がついた。

というのも、20260718のような西暦日付フォルダにその日の作業ファイルを保存するようにしており、この習慣を活用してdirコマンドと*(アスタリスク)を組み合わせたdeskmemoコマンドで日々の作業で使ったファイルや保存ファイルを総覧しているからだ。

dir 20* -dir | % { dir $_ }

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

deskmemo2

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'の表示結果

    deskmemo2 '\d{4}08'の表示結果

202608と続く8月フォルダはマッチするのだが、7月の20260708フォルダにもマッチしてしまう。正確に8月のフォルダだけをマッチさせるには、08のあとにも数字(\d)2つが続くことを伝えると

deskmemo2 '\d{4}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}]'

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

  • deskmemo2 '^[\p{IsHiragana}\p{IsKatakana}\p{IsCJKUnifiedIdeographs}]'で日本語フォルダマッチ

    deskmemo2 '^[\p{IsHiragana}\p{IsKatakana}\p{IsCJKUnifiedIdeographs}]'で日本語フォルダマッチ