none
後方参照と変数の結合方法を知りたい

    質問

  • -replace演算子で正規表現を置き換える際、後方参照と変数の組み合わせで置き換える方法がいまひとつわかりません

    例を上げると、次の文字列で数字5けたに続いて存在するリテラル「NAME」を数字はそのままに変数$nameで置き換える方法です。

    "ID12345NAME_rest" 

    $nameの値が「nanashi」だとすると"ID12345nanashi_rest"という文字列を得たいのです。 

    最初に「

    "ID12345NAME_rest" -replace "(\d{5})NAME", ('$1'+$name)

    」を試みましたが'$1'が後方参照ではなくリテラルの'$1'として置換されてしましました。

    カッコを外した「

    "ID12345NAME_rest" -replace "(\d{5})NAME", '$1'+$name

    」はエラーになります。

    "ID12345NAME_rest" -replace "(\d{5})NAME", '$1$name'

    」では後方参照は可能でしたが「$name」が展開されません。結局「

    "ID12345NAME_rest" -match "(?<head>^.*\d{5})NAME(?<tail>.*)"

    $matches.head+$name+$matches.tail

    」で初期の目的は果たせたのですが、-replace演算子での書き方を知りたいと思い質問しました。

    ※投稿前に、手元のlinux版powershell(PSVersion=6.0.0-rc.2)で確認したところ最初の「

    "ID12345NAME_rest" -replace "(\d{5})NAME", ('$1'+$name)

    」が意図の通りに機能しました。もしかしたら、powershellのバージョンによってはこの書き方でいいのかもしれませんが、

    知りたいのはWindows7上のpowershell2.0での書き方です。

    2018年1月10日 5:16

回答

  • 杞憂かもしれませんが、元質問者さんがWin7 PS 2.0環境で試された際、$nameの値が数値から始まっていたりしませんか?

    例えば $name = '774' だとすると ('$1' + $name) は '$1774' となってしまい正しく展開できなくなるはずです。

    なお、質問の例に関しては

    "ID12345NAME_rest" -replace "(?<=\d{5})NAME", $name

    とする方法もあります。

    • 回答としてマーク ballville 2018年1月11日 0:06
    2018年1月10日 13:15

すべての返信

  • "`$1$name"

    バッククオートで$をエスケープで、どうでしょう。

    // PS2.0環境自体はなかったので、PS5.1を-version 2.0で動かして確認。

    <追記>あー、冷静に考えると ('$1'+$name) と同じですね。素のPS2.0だと動かないのか。
    • 編集済み Hongliang 2018年1月10日 5:55
    2018年1月10日 5:37
  • 返信ありがとうございます

    今の環境は先述のlinuxしかないので後日、確かめてみます。


    • 編集済み ballville 2018年1月10日 6:23
    2018年1月10日 6:22
  • Windows7 /PowerShell 2.0の環境で試してみましたが、問題なく後方参照できているように見えます。-replace演算子の使い方自体には間違いなさそうです。
    2018年1月10日 12:00
    モデレータ
  • 杞憂かもしれませんが、元質問者さんがWin7 PS 2.0環境で試された際、$nameの値が数値から始まっていたりしませんか?

    例えば $name = '774' だとすると ('$1' + $name) は '$1774' となってしまい正しく展開できなくなるはずです。

    なお、質問の例に関しては

    "ID12345NAME_rest" -replace "(?<=\d{5})NAME", $name

    とする方法もあります。

    • 回答としてマーク ballville 2018年1月11日 0:06
    2018年1月10日 13:15
  • ありがとうございました。それでした。

    実際、問題が起きたときの変数値は「00」でした。PSのバージョンは関係なかったのですね。

    問題の切り分けがうまくできていなかったため、他回答者様にはご迷惑をおかけしたかもしれません。

    申し訳ありませんでした。

    また、「(?<=」という記法も初めて知りました。重ねてお礼申し上げます。

    2018年1月11日 0:13