在Swift中从文件名中删除后缀

时间:2016-10-06 04:50:24

标签: swift string split suffix

尝试从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,这是整个事情中最无聊的部分。

10 个答案:

答案 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”

相关问题