3

我想拆分格式为 ArtistTitle的歌曲名称,以便它们最终成为Artist - Title

Powershell 中有没有办法检测 CamelCase 边界并执行替换?这应该只影响第一个案例边界并忽略其余部分。

4

2 回答 2

8

您可以使用区分大小写的正则表达式在任何大写字符之前拆分字符串,删除空元素,然后用破折号连接剩下的内容:

PS> 'ArtistTitle' -csplit '(?=[A-Z])' -ne '' -join '-'
Artist-Title

要仅拆分第一个单词,请使用拆分运算符 (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 回答