簡體   English   中英

從 Swift 中的文件名中刪除后綴

[英]Remove suffix from filename in Swift

當試圖從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 ,這是整個事情中最乏味的部分。

如果后綴是指路徑擴展,則有一種方法:

let filename = "demoArt.png"
let name = (filename as NSString).deletingPathExtension
// name - "demoArt"

這里有些人似乎忽略了文件名可以在名稱中包含多個句點,在這種情況下,只有最后一個句點分隔文件擴展名。 所以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

在 iOS Array 中以 0 開頭並且您想要沒有擴展名的文件名,因此您使用. ,現在名稱將存儲在第一個對象中,擴展名將存儲在第二個對象中。

簡單示例

let fileName = "demoArt.png"
let name = fileName.characters.split(".").map(String.init).first

您還可以使用 componentsSeparatedBy 拆分字符串,如下所示:

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”組成的數組。

@Confused with 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)
}

如果您不在乎擴展名是什么。 這是一個簡單的方法。

let ss = filename.prefix(upTo: fileName.lastIndex { $0 == "." } ?? fileName.endIndex))

您可能希望在此之后將結果子字符串轉換為字符串。 String(ss)

您還可以使用 Regexp 提取最后一個點之前的所有部分,如下所示:

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
let mp3Files = ["alarm.mp3", "bubbles.mp3", "fanfare.mp3"]
let ringtonsArray = mp3Files.flatMap { $0.components(separatedBy: ".").first }

使用.dropLast(k)怎么樣,其中k是您從后綴中刪除的字符數?

否則,為了從文件名中正確刪除路徑中的擴展名,我堅持您使用 URL 和.deletingPathExtension().lastPathComponent

也許有點開銷,但至少它是一個堅如磐石的 Apple API。

您可以返回一個新字符串,從末尾刪除一定數量的字符。

   let fileName = "demoArt.png"
   fileName.dropLast(4)

此代碼返回“demoArt”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM