3

ArtistTitleの形式の曲名を分割して、Artist - Titleになるようにしたいと思います。

Powershell で CamelCase 境界を検出して置換を実行する方法はありますか? これは、最初のケース境界にのみ影響し、残りは無視する必要があります。

4

2 に答える 2

8

大文字と小文字を区別する正規表現を使用して、大文字の直前で文字列を分割し、空の要素を削除して、残りをダッシュ​​で結合できます。

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
于 2013-07-14T21:08:10.697 に答える
0

私はそれを行う大まかな方法​​を作成することになりました。コードはファイル名を取得し、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 ' - ')}
于 2013-07-14T21:55:34.833 に答える