none
PowerShell で regex::Replace 使用時、置換 $0 が空になります RRS feed

  • 質問

  • お世話になっております。

    PowerShell 3.0 を Windows 7 Professional 64bit で使用しています。

    PowerShellから呼び出した場合のRegEx クラスに関して、質問があります。
    (VB.NET のツール(.NET Framework) ではうまく実行できるので、PowerShell 関連として質問させていただきます)

    PowerShell のコマンドラインから、たとえば
    "1234512345" | %{[regex]::Replace($_, "(123)", "*$0*")
    と入力したとき
    *123*45*123*45
    と出力されることを期待しているのですが、
    **45**45
    と表示されてしまいます。

    "1234512345" | %{[regex]::Replace($_, "(123)", "*$&*")
    *123*45*123*45
    と表示されます。

    PowerShellからRegEx呼び出した場合、何らかの理由で置き換えパターンに$0 や$1 などは使用できないのでしょうか?
    どうも不可解です。
    ちなみに
    "1234512345" | %{[regex]::Replace($_, "(?<name>123)", "*${name}*")

    "1234512345" | %{[regex]::Replace($_, "(?`<name`>123)", "*${name}*")

    **45**45
    と表示されて置き換えされません。
    理由ご存知の方、恐れ入りますがご教示のほどお願い致します。

    2013年7月4日 6:44

回答

すべての返信

  • http://ufcpp.net/study/powershell/string.html

    ""文字列だと、文字列中に$から始まる文字列が含まれた場合変数として展開されてしまいます。

    ''文字列にしたり、`で$をエスケープしたりしてください。

    • 回答としてマーク Always fresh 2013年7月4日 7:09
    2013年7月4日 7:03
  • Hongliang 様

    どうも有難う御座います。$0 は、変数として解釈されてしまったのですね。

    バッククォートでエスケープしたところ、無事うまく動きました。

    "1234512345" | %{[regex]::Replace($_, "(123)", '*$0')
    "1234512345" | %{[regex]::Replace($_, "(123)", "*`$0*")
    

    すぐにご回答をいただけ、助かりました。また、宜しくお願い致します。

    • 編集済み Always fresh 2013年7月4日 7:12 解決したコードを入れました
    2013年7月4日 7:09