Swift:访问URL路径时清理字符串,去除歌曲列表中的专辑名
解决iTunes歌曲路径中去除专辑名的问题
要提取纯歌曲名并去掉前面的专辑层级,别用批量字符串替换这种容易出错的方式——直接针对每个路径做精准处理更可靠,这里有几个实用方案:
方案一:用系统路径API提取文件名(推荐)
Foundation框架提供了成熟的路径处理工具,能自动应对各种路径层级和特殊字符,完全不需要手动拼接字符串。具体实现如下:
let completePath = "/Music/Itunes/iTunes Media/Music" do { // 获取目录下所有子路径 let subpaths = try FileManager.default.subpathsOfDirectory(atPath: completePath) // 过滤掉目录,只保留实际的歌曲文件(可选,按需开启) let songFiles = subpaths.filter { path in let fullFilePath = (completePath as NSString).appendingPathComponent(path) var isDirectory: ObjCBool = false return FileManager.default.fileExists(atPath: fullFilePath, isDirectory: &isDirectory) && !isDirectory.boolValue } // 提取每个文件的纯歌曲名(自动剥离前面的专辑/艺术家目录) let songNames = songFiles.map { path in // 两种等价写法,选你习惯的即可 (path as NSString).lastPathComponent // URL(fileURLWithPath: path).lastPathComponent } // 拼接成你需要的列表格式 let songList = songNames.joined(separator: "\n") print(songList) } catch { print("读取目录失败:\(error.localizedDescription)") }
这个方案的核心是利用lastPathComponent直接获取路径的最后一段,不管路径有多少层级(比如Artist/Album/Song.mp3),都能精准提取出Song.mp3,稳定性拉满。
方案二:正则表达式替换(适合已拼接好的字符串)
如果已经提前把所有路径拼接成了list字符串,也可以用正则批量清理:
// 针对已拼接好的list字符串做替换 let cleanedSongList = list.replacingOccurrences( of: "^.*\\/", with: "", options: .regularExpression, range: nil ) print(cleanedSongList)
正则^.*\/会匹配每行开头到最后一个/的所有内容,替换为空后就只剩下纯歌曲名。不过这个方法不如方案一健壮,要是路径里有异常换行或特殊字符,可能会出现匹配失误。
额外优化:过滤特定音频格式
如果需要只保留常见的歌曲格式(比如.mp3、.m4a),可以在过滤步骤加个后缀判断:
let allowedExtensions = ["mp3", "m4a", "aac", "flac"] let songFiles = subpaths.filter { path in let fullFilePath = (completePath as NSString).appendingPathComponent(path) var isDirectory: ObjCBool = false let isFile = FileManager.default.fileExists(atPath: fullFilePath, isDirectory: &isDirectory) && !isDirectory.boolValue // 检查文件后缀是否在允许列表内 let fileExt = (path as NSString).pathExtension.lowercased() return isFile && allowedExtensions.contains(fileExt) }
这样得到的列表只会包含有效音频文件,更适配后续接入YouTube API的需求。
内容的提问来源于stack exchange,提问作者Emerson
相关产品推荐
相关产品推荐

