如何从String中删除或替换所有标点符号?

qml*_*ery 12 macos ios swift

我有一个由单词组成的字符串,其中一些包含标点符号,我想删除它,但我一直无法弄清楚如何执行此操作.

例如,如果我有类似的东西

var words = "Hello, this : is .. a  string?"
Run Code Online (Sandbox Code Playgroud)

我希望能够创建一个数组

"[Hello, this, is, a, string]"
Run Code Online (Sandbox Code Playgroud)

我最初的想法是使用类似的东西words.stringByTrimmingCharactersInSet()删除我不想要的任何字符,但这只会使字符脱离结束.

我想也许我可以用一些东西来迭代字符串

for letter in words {
    if NSCharacterSet.punctuationCharacterSet.characterIsMember(letter){
        //remove that character from the string
    }
}
Run Code Online (Sandbox Code Playgroud)

但我不确定如何从字符串中删除字符.我确信if语句的设置方式也存在一些问题,但它显示了我的思考过程.

Leo*_*bus 21

Xcode 8.3.2•Swift 3.1

extension StringProtocol {
    var words: [SubSequence] {
        return split{ !$0.isLetter }
    }
}
Run Code Online (Sandbox Code Playgroud)
let sentence = "Hello, this : is .. a  string?"
let words = sentence.words  // ["Hello", "this", "is", "a", "string"]
Run Code Online (Sandbox Code Playgroud)


Mar*_*n R 5

String有一种enumerateSubstringsInRange()方法。使用该.ByWords选项,它会自动检测单词边界和标点符号:

迅捷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]
Run Code Online (Sandbox Code Playgroud)

斯威夫特2:

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]
Run Code Online (Sandbox Code Playgroud)

  • 感谢enumerateSubstringsInRange和.ByWords。很有意思。 (2认同)

alg*_*gal 5

这适用于 Xcode 8.1、Swift 3:

首先定义用于过滤的通用扩展CharacterSet

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
  }
}
Run Code Online (Sandbox Code Playgroud)

然后使用标点符号过滤:

let s:String = "Hello, world!"
s.removingCharacters(inCharacterSet: CharacterSet.punctuationCharacters) // => "Hello world"
Run Code Online (Sandbox Code Playgroud)