ArtistTitleの形式の曲名を分割して、Artist - Titleになるようにしたいと思います。
Powershell で CamelCase 境界を検出して置換を実行する方法はありますか? これは、最初のケース境界にのみ影響し、残りは無視する必要があります。
ArtistTitleの形式の曲名を分割して、Artist - Titleになるようにしたいと思います。
Powershell で CamelCase 境界を検出して置換を実行する方法はありますか? これは、最初のケース境界にのみ影響し、残りは無視する必要があります。
大文字と小文字を区別する正規表現を使用して、大文字の直前で文字列を分割し、空の要素を削除して、残りをダッシュで結合できます。
PS> 'ArtistTitle' -csplit '(?=[A-Z])' -ne '' -join '-'
Artist-Title
最初の単語だけを分割するには、Split 演算子の 2 番目のパラメーター (Max-substrings) を使用して、返される部分文字列の最大数を指定します。詳細については、次のabout_Split
ヘルプ トピックを参照してください。
PS> 'ArtistVeryLongAlbumTitle' -csplit '(?=[A-Z])',3 -ne '' -join '-'
Artist-VeryLongAlbumTitle
更新: 大文字が最初のもの (文字列の先頭) である場合、大文字を分割しない正規表現パターンを使用してコマンドを短くすることができたので、空の項目は作成されません:
PS> 'ArtistVeryLongAlbumTitle' -csplit '(?<!^)(?=[A-Z])',2 -join '-'
Artist-VeryLongAlbumTitle
私はそれを行う大まかな方法を作成することになりました。コードはファイル名を取得し、ArtistTitle 境界を検索して、Artist と Title の間にハイフンを付けてファイルの名前を変更します。
ls | foreach { $result = ($_.Name -cmatch '^(\w*?[a-z])([A-Z])'); $search = "$($matches[1])$($matches[2])"; $replace = "$($matches[1]) - $($matches[2])"; Rename-Item $_ -NewName ($_.Name -replace $search, $replace) }
アップデート:
Shay Levy の回答を組み込むと、結果のコマンドははるかに短くなります。
ls | foreach -Process { Rename-Item $_ -NewName ($_.Name -csplit '(?<!^)(?=[A-Z])',2 -join ' - ')}