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"