You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:56:35