2

我有一组我允许在我的字符串中的字符:

var characterSet:NSCharacterSet = NSCharacterSet(charactersInString: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLKMNOPQRSTUVWXYZ")

我想从字符串中删除任何其他字符,以便可以将两个未格式化的数据视为相等,如下所示:

"American Samoa".lowercaseString == "american_samoa1".lowercaseString

这些转换后的字符串的小写版本将是"americansamoa"

4

5 回答 5

9

让我们为此编写一个函数(在 swift 1.2 中)。

func stripOutUnwantedCharactersFromText(text: String, set characterSet: Set<Character>) -> String {
    return String(filter(text) { set.contains($0) })
}

你可以这样称呼它:

let text = "American Samoa"
let chars = Set("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
let strippedText = stripOutUnwantedCharactersFromText(text, set: chars)

纯迅捷。是的。

于 2015-03-02T21:56:16.177 回答
3

你走在正确的轨道上。但是你可以invertedSet在你的 NSCharSet 上使用。这意味着您允许您在 中设置的每个字符NSCharSet,因为这样做更容易。否则,您需要检查您不想允许的每个字符,这些字符远不止设置允许的字符:

var charSet = NSCharacterSet(charactersInString: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ").invertedSet
var unformatted = "american_samoa1"
var cleanedString = join("", unformatted.componentsSeparatedByCharactersInSet(charSet))

println(cleanedString) // "americansamoa"

如您所见,我join在创建的数组上使用该方法。我这样做是因为你真的想要一个字符串,否则你会有一个字符串数组。

于 2015-03-02T21:44:24.987 回答
3

为 Swift 2.3 更新了以下示例以替换该join方法。

let charSet = NSCharacterSet(charactersInString: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ").invertedSet
let unformatted = "american_samoa1"
let cleanedString = unformatted.componentsSeparatedByCharactersInSet(charSet)).joinWithSeparator("")

print(cleanedString) // "americansamoa"
于 2016-08-16T05:08:45.977 回答
3

Swift 3升级后的答案:

let jpegName = "<Hit'n'roll>.jpg"
let disallowedChars = CharacterSet.urlPathAllowed.inverted
let fileName = fileName.components(separatedBy: disallowedChars).joined(separator: "_")
于 2017-06-01T07:57:33.450 回答
0

这目前适用于 swift 3.X

func strip(unformatted: String) -> String {
    let disallowedChars = CharacterSet.letters.inverted
    let formatted = unformatted.components(separatedBy: disallowedChars).joined(separator: "")
    return formatted.lowercased()
}
于 2017-10-25T13:35:07.560 回答