2015-04-16 5 views
9

Ho una stringa composta da parole, alcune delle quali contengono segni di punteggiatura, che vorrei rimuovere, ma non sono riuscito a capire come farlo.Come posso rimuovere o sostituire tutti i caratteri di punteggiatura da una stringa?

Per esempio, se ho qualcosa di simile

var words = "Hello, this : is .. a string?" 

Vorrei essere in grado di creare un array con

"[Hello, this, is, a, string]" 

Il mio pensiero originale era quello di usare qualcosa come words.stringByTrimmingCharactersInSet() per rimuovere eventuali caratteri I non volevo, ma questo avrebbe solo preso i caratteri dalle estremità.

ho pensato che forse avrei potuto scorrere la stringa con qualcosa in vena di

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

ma sono sicuri di come rimuovere il carattere della stringa. Sono sicuro che ci sono alcuni problemi con il modo in cui viene impostata anche l'istruzione, ma mostra il mio processo di pensiero. modo

risposta

10

Xcode 8.3.2 • Swift 3,1

extension String { 
    var words: [String] { 
     return components(separatedBy: .punctuationCharacters) 
      .joined() 
      .components(separatedBy: .whitespaces) 
      .filter{!$0.isEmpty} 
    } 
} 

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

Ho finito per utilizzare una combinazione di alcune di queste soluzioni per farlo funzionare, ma questo mi ha aiutato a ottenere l'ultimo errore che avevo risolto. Ho finito per creare un NSMutableCharacterset che era alfanumericoCharacterSet più "". Quindi ho usato la soluzione qui per ottenere ciò di cui avevo bisogno senza avere spazi aggiuntivi. – qmlowery

0

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) 
+0

Ciò non divisa su spazio. – halex

+0

Questo non fornisce una risposta alla domanda. Per criticare o richiedere chiarimenti da un autore, lascia un commento sotto il loro post. –

+0

@halex Ci scusiamo per il post sbagliato. Ho modificato il mio post. – nickcheng

-1
let charactersToRemove = NSCharacterSet.punctuationCharacterSet().invertedSet 
let aWord = "".join(words.componentsSeparatedByCharactersInSet(charactersToRemove)) 
0

Un modo alternativo per filtrare caratteri di un set ed ottenere un array o Le parole f utilizzano i metodi filter e reduce dell'array. Non è compatto come altre risposte, ma mostra come lo stesso risultato può essere ottenuto in un modo diverso.

Prima di definire una serie di personaggi da rimuovere:

let charactersToRemove = Set(Array(".:?,")) 

prossimo convertire la stringa di input in un array di caratteri:

let arrayOfChars = Array(words) 

Ora possiamo usare reduce per costruire una stringa, ottenuto aggiungendo gli elementi da arrayOfChars, ma saltando tutti quelli inclusi in charactersToRemove:

let filteredString = arrayOfChars.reduce("") { 
    let str = String($1) 
    return $0 + (charactersToRemove.contains($1) ? "" : str) 
} 

Questo produce una stringa senza i caratteri di punteggiatura (come definito in charactersToRemove).

Gli ultimi 2 fasi:

dividere la stringa in un array di parole, utilizzando il carattere bianco come separatore:

let arrayOfWords = filteredString.componentsSeparatedByString(" ") 

ultimi, rimuovere tutti gli elementi vuoti:

let finalArrayOfWords = arrayOfWords.filter { $0.isEmpty == false } 
3

String ha un metodo enumerateSubstringsInRange(). Con l'opzione .ByWords, rileva i limiti di parole e la punteggiatura automaticamente:

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] 

Swift 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] 
+2

Grazie per enumerateSubstringsInRange & .ByWords. Molto interessante. –

+0

Questo codice deve essere aggiornato per swift 4 o potrebbe essere veloce 3 –

+0

@InderKumarRathore: aggiornato per Swift 3. (Dovrebbe funzionare anche in Swift 4, lo controllerò più avanti) - Grazie per l'avviso! –

2

Questo funziona con Xcode 8.1 , Swift 3:

innanzitutto definire estensione generica per filtraggio per 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 
    } 
} 

quindi filtrare utilizzando la punteggiatura:

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