none
正規表現における記号のエスケープ方法 RRS feed

  • 質問

  • 以下のような行(文字列)が存在するテキストファイル log.txt があります。

    Date Time Message ["Start"] 

    この文字列が存在する行だけを取り出したいのですが、Findstr以外の方法を取りたいので、where文を使うことにしました。

    ところが、以下の二種類の方法を取っても、意図した結果が得られません。

    ① get-content log.txt | Where-Object { $_ -match "Date Time Message `[`"Start`"`]" }
    ② get-content log.txt | Where-Object { $_ -match "Date Time Message \[\"Start\"\]" }

    正規表現検索に対応しているテキストエディタでは Date Time Message \[\"Start\"\] で検索できているので、構文自体は正しいような気もするのですが、これはどう理解すればよいでしょうか。

    よろしくお願いいたします。


    • 編集済み Fuzitaman 2015年6月29日 0:46 構文をコードブロックに入れた
    2015年6月29日 0:45

回答

  • "Date Time Message \[`"Start`"\]"

    で良いかと思います。

    「"」はPowerShellで文字列を示す記号なので、PowerShellのエスケープ文字「`」を使ってエスケープする必要があります。

    (「""」のようにダブルクォーテーションを重ねる、あるいは正規表現全体を「'」(シングルクォーテーション)で括るのでもOKです)

    「[」と「]」は、正規表現で文字セットや文字範囲を示すメタ文字なので、正規表現のエスケープ記号である「¥」でエスケープする必要があります。

    (「"」は正規表現の中でエスケープしなくて良い。しても問題ないですが)

    PowerShellでエスケープが必要な文字、正規表現でエスケープが必要な文字を、ごちゃ混ぜにしないように、注意が必要かと思います。



    2015年6月29日 1:12
    モデレータ
  • もう少し表現を変えると

    PowerShellに依存しない正規表現のパターンとしては 「Date Time Message \["Start"\]」(バックスラッシュによるエスケープ)。

    この正規表現パターンをPowerShellソースコードに記述するには "Date Time Message \[`"Start`"\]" となります(バッククォートによるエスケープ)。

    2015年6月29日 1:47

すべての返信

  • "Date Time Message \[`"Start`"\]"

    で良いかと思います。

    「"」はPowerShellで文字列を示す記号なので、PowerShellのエスケープ文字「`」を使ってエスケープする必要があります。

    (「""」のようにダブルクォーテーションを重ねる、あるいは正規表現全体を「'」(シングルクォーテーション)で括るのでもOKです)

    「[」と「]」は、正規表現で文字セットや文字範囲を示すメタ文字なので、正規表現のエスケープ記号である「¥」でエスケープする必要があります。

    (「"」は正規表現の中でエスケープしなくて良い。しても問題ないですが)

    PowerShellでエスケープが必要な文字、正規表現でエスケープが必要な文字を、ごちゃ混ぜにしないように、注意が必要かと思います。



    2015年6月29日 1:12
    モデレータ
  • 牟田口様、うまくいきました。

    シングルクォートについては、そんなことをしたら` や \ も 、ただの文字として処理される、という理解でしたが、

    ご指摘の通り、PowerShellでエスケープが必要な文字、正規表現でエスケープが必要な文字を完全に混同しておりました。

    ありがとうございました。

    2015年6月29日 1:43
  • もう少し表現を変えると

    PowerShellに依存しない正規表現のパターンとしては 「Date Time Message \["Start"\]」(バックスラッシュによるエスケープ)。

    この正規表現パターンをPowerShellソースコードに記述するには "Date Time Message \[`"Start`"\]" となります(バッククォートによるエスケープ)。

    2015年6月29日 1:47
  • よくわかりました。もう悩まずに済みそうです。ありがとうございました。

    2015年6月29日 14:15