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
构造为单字符 String
的 Set
:
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
}
一个字符串,例如 ! !! 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
构造为单字符 String
的 Set
:
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
}