質問: PowerShellで正規表現を使ったファイル名の変更をしたいのですが、うまくいかなくて困ってます。 例えば、 ``` ls "F:\Pictures\" | Rename-Item -WhatIf -NewName {$_.Name -replace '.*(\d{1,3}.*)','$1'} ``` と実行すると、 ``` WhatIf: 対象 "項目: F:\Pictures\photo1.jpg 変更先: F:\Pictures\1.jpg" に対して操作 "ファイル名の変更" を実行しています。 WhatIf: 対象 "項目: F:\Pictures\photo12.jpg 変更先: F:\Pictures\2.jpg" に対して操作 "ファイル名の変更" を実行しています。 WhatIf: 対象 "項目: F:\Pictures\photo123.jpg 変更先: F:\Pictures\3.jpg" に対して操作 "ファイル名の変更" を実行しています。 ``` と出力されます。 変更前のナンバリング番号と拡張子を後方参照で取り出すだけですが、ナンバリングの最後の数字しかマッチしません。 目的の出力結果として、 ``` WhatIf: 対象 "項目: F:\Pictures\photo1.jpg 変更先: F:\Pictures\1.jpg" に対して操作 "ファイル名の変更" を実行しています。 WhatIf: 対象 "項目: F:\Pictures\photo12.jpg 変更先: F:\Pictures\12.jpg" に対して操作 "ファイル名の変更" を実行しています。 WhatIf: 対象 "項目: F:\Pictures\photo123.jpg 変更先: F:\Pictures\123.jpg" に対して操作 "ファイル名の変更" を実行しています。 ``` のようにしたいのですが、どうすれば良いでしょうか?
回答: 量指定子`*`はできるだけ長い文字列にマッチしようとする(最長マッチ)ので そのような結果になります。 修正案としては、最短マッチの`*?`を使って ``` "photo123.jpg" -replace '.*?(\d{1,3}.*)','$1' #=>123.jpg ``` とするか、photoの部分は数字以外`\D*`としてマッチさせるとかでしょうか。 ``` "photo123.jpg" -replace '\D*(\d{1,3}.*)','$1' #=>123.jpg ```