正規表現の後方参照

2009/11/26  23:31              Users
2009/12/23  21:58              logs
このような文字列があり、「2009/11/26」、「2009/12/23」、「Users」、「logs」のみを抽出したい場合は後方参照を使う事が可能です。パターン内の抽出するメタキャラクタを()で囲みます。()で囲まれたメタキャラクタに一致した文字列は、プログラム内で参照可能となります。まず、今回の場合、日付部分の「^\d{4}/\d{2}/\d{2}」とフォルダ部分の「.*$」を()で囲みます。

(^\d{4}/\d{2}/\d{2}) {2}\d{2}:\d{2}.{20}(.*$)

そして、指定したパターンを検索後、matchクラスのresultメソッドで取得できます。引数として"`$1 `$2"というように指定します。今回でいう$1は日付部分にあたり$2はフォルダ部分となります。以下は実際に使用したプログラムとなります。

set-PSDebug -strict
# ----------------------------
# 正規表現テスト2
# 第一引数:ファイルパス
# 第二引数:パターン
# ----------------------------
function RegularExpressionTest2{
    # 引数の取得
    param([string]$fpath,[string]$pattern)
    
    # encoding設定
    $encoding = [system.Text.Encoding]::GetEncoding("shift_jis")
    
    # ファイルオープン
    $stream = new-Object system.IO.StreamReader($fpath, $encoding)
    
    # ファイル読み込み
    $text = $stream.readtoend()
    
    # ファイルクローズ
    $stream.close()
    
    # 正規表現検索
    $m = new-Object regex $pattern,("Multiline")
    $results = $m.matches($text)
    
    # 結果画面表示
    write-Host "***結果***"
    foreach ( $match in $results ){
        $match.result("`$1 `$2")
    }
}