簡體   English   中英

如何從字符串中刪除或替換所有標點符號?

[英]How can I remove or replace all punctuation characters from a String?

我有一個由單詞組成的字符串,其中一些包含標點符號,我想將其刪除,但我一直無法弄清楚如何執行此操作。

例如,如果我有類似的東西

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 語句的設置方式也存在一些問題,但它顯示了我的思考過程。

Xcode 11.4 • Swift 5.2 或更高版本

extension StringProtocol {
    var words: [SubSequence] {
        split(whereSeparator: \.isLetter.negation)
    }
}

extension Bool {
    var negation: Bool { !self }
}

let sentence = "Hello, this : is .. a  string?"
let words = sentence.words  // ["Hello", "this", "is", "a", "string"]

 

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]

斯威夫特 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]

這適用於 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
  }
}

然后使用標點符號過濾:

let s:String = "Hello, world!"
s.removingCharacters(inCharacterSet: CharacterSet.punctuationCharacters) // => "Hello world"

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)

從集合中過濾字符並獲取單詞數組的另一種方法是使用數組的filterreduce方法。 它不像其他答案那么緊湊,但它顯示了如何以不同的方式獲得相同的結果。

首先定義要刪除的字符數組:

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 )。

最后2步:

將字符串拆分為單詞數組,使用空白字符作為分隔符:

let arrayOfWords = filteredString.componentsSeparatedByString(" ")

最后,刪除所有空元素:

let finalArrayOfWords = arrayOfWords.filter { $0.isEmpty == false }
let charactersToRemove = NSCharacterSet.punctuationCharacterSet().invertedSet
let aWord = "".join(words.componentsSeparatedByCharactersInSet(charactersToRemove))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM