none
置換の構文 RRS feed

  • 質問

  • お世話になります。

    $1をシングルとダブルで囲むのとでは結果ことなります。
    ダブルクォーテーションで囲むと展開されないのはなぜですか。 

    "12.37000" -replace "(\.\d\d[1-9]?)\d*",'$1'
    12.37 

    "12.37000" -replace "(\.\d\d[1-9]?)\d*","$1"
    12 

    2011年10月31日 7:48

回答

  • PowerShellの変数名は$から始まります。そしてダブルクォーテーション内では変数が展開され、中の値に置き換わります。

    すなわち、後者のコードだとPowerShellの「$1」という変数の中身が展開されています。$1には特に値を代入していなければ$nullなので、

    "12.37000" -replace "(\.\d\d[1-9]?)\d*",""

    と等価なコードになります。

    もし「$1」を""の中で正規表現の特殊変数として扱いたい場合は、「$」文字をPowerShellのエスケープ文字「`」でエスケープしてやる必要があります。

    "12.37000" -replace "(\.\d\d[1-9]?)\d*","`$1"

    一方でシングルクォーテーション内では変数の値は展開されません。「$」をエスケープする必要もありません。よって前者のコードは思惑通り、「$1」が正規表現の特殊変数として扱われます。

    • 回答としてマーク Brillia 2011年10月31日 8:59
    2011年10月31日 8:16
    モデレータ

すべての返信

  • PowerShellの変数名は$から始まります。そしてダブルクォーテーション内では変数が展開され、中の値に置き換わります。

    すなわち、後者のコードだとPowerShellの「$1」という変数の中身が展開されています。$1には特に値を代入していなければ$nullなので、

    "12.37000" -replace "(\.\d\d[1-9]?)\d*",""

    と等価なコードになります。

    もし「$1」を""の中で正規表現の特殊変数として扱いたい場合は、「$」文字をPowerShellのエスケープ文字「`」でエスケープしてやる必要があります。

    "12.37000" -replace "(\.\d\d[1-9]?)\d*","`$1"

    一方でシングルクォーテーション内では変数の値は展開されません。「$」をエスケープする必要もありません。よって前者のコードは思惑通り、「$1」が正規表現の特殊変数として扱われます。

    • 回答としてマーク Brillia 2011年10月31日 8:59
    2011年10月31日 8:16
    モデレータ
  • こんにちは

    私も正規表現はまったく詳しくないのですが、

    正規表現のクラスに対して$1という「文字列」を渡す必要があるからでは無いでしょうか。

    ダブルコーテーションでは、Powershellが$1を変数とみなして(PowerShell的には$1という変数は存在していないので)、nullに変換された上で正規表現に渡っていくのではと想像します。

    2011年10月31日 8:27
  • ご返事ありがとうございます。

    特殊変数の扱い理解できました。

    勉強になりました。

    2011年10月31日 8:59