swift: 如何删除特定字符?

swift: how can I delete a specific character?

一个字符串,例如 ! !! yuahl! ! ,我想删除 !</code>,当我这样编码时 </p> <pre><code>for index in InputName.characters.indices { if String(InputName[index]) == "" || InputName.substringToIndex(index) == "!" { InputName.removeAtIndex(index) } }

出现错误“fatal error: subscript: subRange extends past String end”,我该怎么办?谢谢:D

for index in InputName.characters.indices.reversed() {
    if String(InputName[index]) == "" || InputName.substringToIndex(index) == "!" {
        InputName.removeAtIndex(index)
    }
}

如果只需要去掉两端的字符,可以使用stringByTrimmingCharactersInSet(_:)

let delCharSet = NSCharacterSet(charactersInString: "! ")

let s1 = "! aString! !"
let s1Del = s1.stringByTrimmingCharactersInSet(delCharSet)
print(s1Del) //->aString

let s2 = "! anotherString !! aString! !"
let s2Del = s2.stringByTrimmingCharactersInSet(delCharSet)
print(s2Del) //->anotherString !! aString

如果您还需要删除中间的字符,"reconstruct from the filtered output" 会比重复删除单个字符更有效。

var tempUSView = String.UnicodeScalarView()
tempUSView.appendContentsOf(s2.unicodeScalars.lazy.filter{!delCharSet.longCharacterIsMember([=11=].value)})
let s2DelAll = String(tempUSView)
print(s2DelAll) //->anotherStringaString

如果您不介意生成许多中间字符串和数组,这个单行代码可以生成预期的输出:

let s2DelAll2 = s2.componentsSeparatedByCharactersInSet(delCharSet).joinWithSeparator("")
print(s2DelAll2) //->anotherStringaString

Swift 3

在Swift 3中,语法更好一些。由于旧 API 的巨大 Swift 化,工厂方法现在称为 trimmingCharacters(in:)。此外,您可以将 CharacterSet 构造为单字符 StringSet

let string = "!   !! yuahl! !"
string.trimmingCharacters(in: [" ", "!"]) // "yuahl" 

如果您还想删除字符串中间的字符,可以使用 components(separatedBy:).joined():

let string = "!   !! yu !ahl! !"
string.components(separatedBy: ["!", " "]).joined() // "yuahl" 

H/T @OOPer Swift 2 版本

我发现 filter 方法是处理这类事情的好方法:

let unfiltered = "!   !! yuahl! !"

// Array of Characters to remove
let removal: [Character] = ["!"," "]

// turn the string into an Array
let unfilteredCharacters = unfiltered.characters

// return an Array without the removal Characters
let filteredCharacters = unfilteredCharacters.filter { !removal.contains([=10=]) }

// build a String with the filtered Array
let filtered = String(filteredCharacters)

print(filtered) // => "yeah"

// combined to a single line
print(String(unfiltered.characters.filter { !removal.contains([=10=]) })) // => "yuahl"

您还可以添加这样非常有用的扩展程序:

import Foundation


extension String{
 func exclude(find:String) -> String {
    return stringByReplacingOccurrencesOfString(find, withString: "", options: .CaseInsensitiveSearch, range: nil)
 }
 func replaceAll(find:String, with:String) -> String {
    return stringByReplacingOccurrencesOfString(find, withString: with, options: .CaseInsensitiveSearch, range: nil)
 }
}

Swift 5+

let myString = "aaaaaaaabbbb"
let replaced = myString.replacingOccurrences(of: "bbbb", with: "") // "aaaaaaaa"
func trimLast(character chars: Set<Character>) -> String {
    
    let str: String = String(self.reversed())

    guard let index = str.index(where: {!chars.contains([=10=])}) else {
        return self
    }
    return String((str[index..<str.endIndex]).reversed())
}

注意: 通过在String extension中加入这个函数,最后可以删除string中的特定字符。

你可以使用这个:

例如,如果您想从 10%

中删除百分比“%”
 if let i = text.firstIndex(of: "%") {
        text.remove(at: i) //10
    }