Ios 如何删除或替换字符串中的所有标点字符?
我有一个由单词组成的字符串,其中一些包含标点符号,我想将其删除,但我一直不知道如何执行此操作 例如,如果我有Ios 如何删除或替换字符串中的所有标点字符?,ios,swift,macos,Ios,Swift,Macos,我有一个由单词组成的字符串,其中一些包含标点符号,我想将其删除,但我一直不知道如何执行此操作 例如,如果我有 var words = "Hello, this : is .. a string?" 我希望能够创建一个具有 "[Hello, this, is, a, string]" 我最初的想法是使用类似于words.stringByTrimmingCharactersInSet()的方法删除我不想要的字符,但这只会去掉字符的末端 我想也许我可以在字符串中用 for letter in w
var words = "Hello, this : is .. a string?"
我希望能够创建一个具有
"[Hello, this, is, a, string]"
我最初的想法是使用类似于words.stringByTrimmingCharactersInSet()
的方法删除我不想要的字符,但这只会去掉字符的末端
我想也许我可以在字符串中用
for letter in words {
if NSCharacterSet.punctuationCharacterSet.characterIsMember(letter){
//remove that character from the string
}
}
但我不确定如何从字符串中删除该字符。我肯定if语句的设置方式也存在一些问题,但它显示了我的思维过程 NSScaner方式:
let words = "Hello, this : is .. a string?"
//
let scanner = NSScanner(string: words)
var wordArray:[String] = []
var word:NSString? = ""
while(!scanner.atEnd) {
var sr = scanner.scanCharactersFromSet(NSCharacterSet(charactersInString: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKMNOPQRSTUVWXYZ"), intoString: &word)
if !sr {
scanner.scanLocation++
continue
}
wordArray.append(String(word!))
}
println(wordArray)
Xcode 11.4•Swift 5.2或更高版本
extension StringProtocol {
var words: [SubSequence] {
split(whereSeparator: \.isLetter.negation)
}
}
从集合中筛选字符并获得单词数组的另一种方法是使用数组的
筛选
和减少
方法。它不像其他答案那样简洁,但它展示了如何以不同的方式获得相同的结果
首先定义要删除的字符数组:
let charactersToRemove = Set(Array(".:?,"))
接下来,将输入字符串转换为字符数组:
let arrayOfChars = Array(words)
现在,我们可以使用reduce
构建一个字符串,该字符串通过从arrayOfChars
中添加元素获得,但跳过charactersToRemove
中包含的所有元素:
let filteredString = arrayOfChars.reduce("") {
let str = String($1)
return $0 + (charactersToRemove.contains($1) ? "" : str)
}
这将生成一个没有标点字符的字符串(如charactersToRemove
中所定义)
最后两个步骤:
将字符串拆分为一个单词数组,使用空白字符作为分隔符:
let arrayOfWords = filteredString.componentsSeparatedByString(" ")
最后,删除所有空元素:
let finalArrayOfWords = arrayOfWords.filter { $0.isEmpty == false }
String
有一个EnumerateSubstringsRange()
方法。
通过.ByWords
选项,它可以检测单词边界和
自动标点符号:
Swift 3/4:
let string = "Hello, this : is .. a \"string\"!"
var words : [String] = []
string.enumerateSubstrings(in: string.startIndex..<string.endIndex,
options: .byWords) {
(substring, _, _, _) -> () in
words.append(substring!)
}
print(words) // [Hello, this, is, a, string]
let string = "Hello, this : is .. a \"string\"!"
var words : [String] = []
string.enumerateSubstringsInRange(string.characters.indices,
options: .ByWords) {
(substring, _, _, _) -> () in
words.append(substring!)
}
print(words) // [Hello, this, is, a, string]
这适用于Xcode 8.1,Swift 3: 首先定义通过
字符集进行过滤的通用扩展:
extension String {
func removingCharacters(inCharacterSet forbiddenCharacters:CharacterSet) -> String
{
var filteredString = self
while true {
if let forbiddenCharRange = filteredString.rangeOfCharacter(from: forbiddenCharacters) {
filteredString.removeSubrange(forbiddenCharRange)
}
else {
break
}
}
return filteredString
}
}
然后使用标点进行过滤:
let s:String = "Hello, world!"
s.removingCharacters(inCharacterSet: CharacterSet.punctuationCharacters) // => "Hello world"
这不会在空格字符上拆分。这不会提供问题的答案。若要评论或要求作者澄清,请在其帖子下方留下评论。@halex为错误的帖子感到抱歉。我已经修改了我的帖子。@MD谢谢你的留言:)谢谢你列举substringsinrange&.ByWords。非常有趣。此代码需要为swift 4更新,或者可能是swift3@InderKumarRathore:为Swift 3更新。(它在Swift 4中也应该可以工作,我稍后会检查)-谢谢您的通知@马丁纳哈哈!我正准备更新你的答案,这里有你另一个答案的信息:,但你在我之前更新了它。顺便说一句,这适用于swift 4。感谢mate的快速响应:)我最终使用了几种解决方案的混合,以使其工作,但这一个帮助我得到了我修复的最后一个错误。我最终创建了一个NSMutableCharacterset,它是alphanumericCharacterSet加上“”。然后我使用这里的解决方案,在没有额外空间的情况下得到我所需要的。非常感谢。
let string = "Hello, this : is .. a \"string\"!"
var words : [String] = []
string.enumerateSubstringsInRange(string.characters.indices,
options: .ByWords) {
(substring, _, _, _) -> () in
words.append(substring!)
}
print(words) // [Hello, this, is, a, string]
extension String {
func removingCharacters(inCharacterSet forbiddenCharacters:CharacterSet) -> String
{
var filteredString = self
while true {
if let forbiddenCharRange = filteredString.rangeOfCharacter(from: forbiddenCharacters) {
filteredString.removeSubrange(forbiddenCharRange)
}
else {
break
}
}
return filteredString
}
}
let s:String = "Hello, world!"
s.removingCharacters(inCharacterSet: CharacterSet.punctuationCharacters) // => "Hello world"