如何从字符串中去除特殊字符?
How to strip special characters out of string?
我有一组允许在我的字符串中使用的字符:
var characterSet:NSCharacterSet = NSCharacterSet(charactersInString: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLKMNOPQRSTUVWXYZ")
我想从字符串中删除 任何其他 个字符,这样两个未格式化的数据就可以被认为是相等的,如下所示:
"American Samoa".lowercaseString == "american_samoa1".lowercaseString
这些转换后的字符串的小写版本将是 "americansamoa"
你走在正确的轨道上。但是您可以在 NSCharSet 上使用 invertedSet
。这意味着您 允许 您在 NSCharSet
中设置的每个字符,因为这样做更容易。否则,您需要检查您不想允许的每个字符,这些字符比设置允许的字符多得多:
var charSet = NSCharacterSet(charactersInString: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ").invertedSet
var unformatted = "american_samoa1"
var cleanedString = join("", unformatted.componentsSeparatedByCharactersInSet(charSet))
println(cleanedString) // "americansamoa"
如您所见,我在创建的数组上使用了 join
方法。我这样做是因为您确实需要一个字符串,否则您将得到一个字符串数组。
让我们为此编写一个函数(在 swift 1.2 中)。
func stripOutUnwantedCharactersFromText(text: String, set characterSet: Set<Character>) -> String {
return String(filter(text) { set.contains([=10=]) })
}
你可以这样称呼它:
let text = "American Samoa"
let chars = Set("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
let strippedText = stripOutUnwantedCharactersFromText(text, set: chars)
纯粹swift。是的。
为 Swift 2.3 更新了以下示例以替换 join
方法。
let charSet = NSCharacterSet(charactersInString: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ").invertedSet
let unformatted = "american_samoa1"
let cleanedString = unformatted.componentsSeparatedByCharactersInSet(charSet)).joinWithSeparator("")
print(cleanedString) // "americansamoa"
Swift 3 升级答案:
let jpegName = "<Hit'n'roll>.jpg"
let disallowedChars = CharacterSet.urlPathAllowed.inverted
let fileName = fileName.components(separatedBy: disallowedChars).joined(separator: "_")
这目前适用于 swift 3.X
func strip(unformatted: String) -> String {
let disallowedChars = CharacterSet.letters.inverted
let formatted = unformatted.components(separatedBy: disallowedChars).joined(separator: "")
return formatted.lowercased()
}
我有一组允许在我的字符串中使用的字符:
var characterSet:NSCharacterSet = NSCharacterSet(charactersInString: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLKMNOPQRSTUVWXYZ")
我想从字符串中删除 任何其他 个字符,这样两个未格式化的数据就可以被认为是相等的,如下所示:
"American Samoa".lowercaseString == "american_samoa1".lowercaseString
这些转换后的字符串的小写版本将是 "americansamoa"
你走在正确的轨道上。但是您可以在 NSCharSet 上使用 invertedSet
。这意味着您 允许 您在 NSCharSet
中设置的每个字符,因为这样做更容易。否则,您需要检查您不想允许的每个字符,这些字符比设置允许的字符多得多:
var charSet = NSCharacterSet(charactersInString: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ").invertedSet
var unformatted = "american_samoa1"
var cleanedString = join("", unformatted.componentsSeparatedByCharactersInSet(charSet))
println(cleanedString) // "americansamoa"
如您所见,我在创建的数组上使用了 join
方法。我这样做是因为您确实需要一个字符串,否则您将得到一个字符串数组。
让我们为此编写一个函数(在 swift 1.2 中)。
func stripOutUnwantedCharactersFromText(text: String, set characterSet: Set<Character>) -> String {
return String(filter(text) { set.contains([=10=]) })
}
你可以这样称呼它:
let text = "American Samoa"
let chars = Set("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
let strippedText = stripOutUnwantedCharactersFromText(text, set: chars)
纯粹swift。是的。
为 Swift 2.3 更新了以下示例以替换 join
方法。
let charSet = NSCharacterSet(charactersInString: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ").invertedSet
let unformatted = "american_samoa1"
let cleanedString = unformatted.componentsSeparatedByCharactersInSet(charSet)).joinWithSeparator("")
print(cleanedString) // "americansamoa"
Swift 3 升级答案:
let jpegName = "<Hit'n'roll>.jpg"
let disallowedChars = CharacterSet.urlPathAllowed.inverted
let fileName = fileName.components(separatedBy: disallowedChars).joined(separator: "_")
这目前适用于 swift 3.X
func strip(unformatted: String) -> String {
let disallowedChars = CharacterSet.letters.inverted
let formatted = unformatted.components(separatedBy: disallowedChars).joined(separator: "")
return formatted.lowercased()
}