尝试从filename
中删除后缀时,我只留下了后缀,这正是我想要的。
我在这里做错了多少(多少事情):
let myTextureAtlas = SKTextureAtlas(named: "demoArt")
let filename = (myTextureAtlas.textureNames.first?.characters.split{$0 == "."}.map(String.init)[1].replacingOccurrences(of: "\'", with: ""))! as String
print(filename)
这会打印png
,这是整个事情中最无聊的部分。
答案 0 :(得分:6)
这里的一些人似乎忽略了文件名可以在名称中有多个句点,在这种情况下只有最后一个句点分隔文件扩展名。所以this.is.a.valid.image.filename.jpg
并剥离扩展程序应该返回this.is.a.valid.image.filename
而不是this
(这里会产生两个答案)或其他任何内容。正则表达式的答案是正确的,但使用正则表达式有点矫枉过正(可能比使用简单的字符串处理慢10倍)。这是一个适用于所有人的通用功能:
func stripFileExtension ( _ filename: String ) -> String {
var components = filename.components(separatedBy: ".")
guard components.count > 1 else { return filename }
components.removeLast()
return components.joined(separator: ".")
}
print("1: \(stripFileExtension("foo"))")
print("2: \(stripFileExtension("foo.bar"))")
print("3: \(stripFileExtension("foo.bar.foobar"))")
输出:
foo
foo
foo.bar
答案 1 :(得分:5)
在iOS数组中,从0开始,你想要没有扩展名的文件名,所以你使用.
拆分字符串,现在名称将存储在第一个对象中,扩展名存储在第二个对象中。
简单示例
let fileName = "demoArt.png"
let name = fileName.characters.split(".").map(String.init).first
答案 2 :(得分:5)
您也可以使用componentsSeperatedBy拆分String,如下所示:
let fileName = "demoArt.png"
var components = fileName.components(separatedBy: ".")
if components.count > 1 { // If there is a file extension
components.removeLast()
return components.joined(separator: ".")
} else {
return fileName
}
澄清:
fileName.components(separatedBy: ".")
将返回一个由" demoArt"组成的数组。和" png"。
答案 3 :(得分:3)
@Confused与Swift 4你可以这样做:
let fileName = "demoArt.png"
// or on your specific case:
// let fileName = myTextureAtlas.textureNames.first
let name = String(fileName.split(separator: ".").first!)
print(name)
此外,您还应该解开first
,但我不想让示例代码复杂化以解决您的问题。
顺便说一下,因为我最近也需要这个,如果你想要提前删除你知道的特定后缀,你可以这样做:
let fileName = "demoArt.png"
let fileNameExtension = ".png"
if fileName.hasSuffix(fileNameExtension) {
let name = fileName.prefix(fileName.count - fileNameExtension.count)
print(name)
}
答案 4 :(得分:2)
您还可以使用正则表达式提取最后一个点之前的所有部分:
let fileName = "test.png"
let pattern = "^(.*)(\\.[a-zA-Z]+)$"
let regexp = try! NSRegularExpression(pattern: pattern, options: [])
let extractedName = regexp.stringByReplacingMatches(in: fileName, options: [], range: NSMakeRange(0, fileName.characters.count), withTemplate: "$1")
print(extractedName) //test
答案 5 :(得分:2)
如果后缀是路径扩展,那么有一种方法可以实现:
let filename = "demoArt.png"
let name = (filename as NSString).deletingPathExtension
// name - "demoArt"
答案 6 :(得分:1)
let mp3Files = ["alarm.mp3", "bubbles.mp3", "fanfare.mp3"]
let ringtonsArray = mp3Files.flatMap { $0.components(separatedBy: ".").first }
答案 7 :(得分:1)
如果你不在乎扩展名是什么。这是一种简单的方法。
filename.prefix(upTo: fileName.lastIndex { $0 == "." } ?? fileName.endIndex)
答案 8 :(得分:0)
如何使用.dropLast(k)
,其中k
是您从后缀删除的字符数?
否则,为了正确从文件名中删除路径的扩展名,我坚持要求您使用URL和.deletingPathExtension().lastPathComponent
。
也许有点开销,但至少它是坚如磐石的Apple API。
答案 9 :(得分:0)
您可以返回一个新字符串,从末尾删除一定数量的字符。
let fileName = "demoArt.png"
fileName.dropLast(4)
此代码返回“ demoArt”