web-dev-qa-db-fra.com

Supprimer le jeu de caractères d'espacement de la chaîne en excluant l'espace

Comment puis-je supprimer le jeu de caractères d'espacement d'une chaîne tout en conservant les espaces simples entre les mots. Je voudrais supprimer les espaces doubles et triples, etc ...

17
Tom Coomer

Swift 3

extension String {
    func condensingWhitespace() -> String {
        return self.components(separatedBy: .whitespacesAndNewlines)
            .filter { !$0.isEmpty }
            .joined(separator: " ")
    }
}

let string = "  Lorem   \r  ipsum dolar   sit  amet. "
print(string.condensingWhitespace())
// Lorem ipsum dolar sit amet.

Legacy Swift

NSCharacterSet rend ceci facile:

func condenseWhitespace(string: String) -> String {
    let components = string.componentsSeparatedByCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet()).filter({!isEmpty($0)})
    return join(" ", components)
}

var string = "  Lorem   \r  ipsum dolar   sit  amet. "
println(condenseWhitespace(string))
// Lorem ipsum dolar sit amet.

ou si vous préférez une extension String:

extension String {
    func condenseWhitespace() -> String {
        let components = self.componentsSeparatedByCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet()).filter({!Swift.isEmpty($0)})
        return " ".join(components)
    }
}

var string = "  Lorem   \r  ipsum dolar   sit  amet. "
println(string.condenseWhitespace())
// Lorem ipsum dolar sit amet.

Tout crédit à la NSHipster post sur NSCharacterSet .

49
Nate Cook

Swift 2 code compatible:

extension String {
    var removeExcessiveSpaces: String {
        let components = self.componentsSeparatedByCharactersInSet(NSCharacterSet.whitespaceCharacterSet())
        let filtered = components.filter({!$0.isEmpty})
        return filtered.joinWithSeparator(" ")
    }
}

Usage:

let str = "test  spaces    too many"
print(str.removeExcessiveSpaces)
// Output: test spaces too many
11
Vasily

Lorsque vous avez un arrière-plan Objective-C/Foundation, il peut sembler évident d’utiliser componentsSeparatedByCharactersInSet(:) avec Swift afin de couper votre chaîne de ses caractères d’espace redondants.

Les étapes à suivre ici consistent à extraire de votre chaîne un tableau de String dans lequel tous les espaces blancs ont été remplacés par des chaînes vides, à filtrer ce tableau dans un nouveau tableau de String où toutes les chaînes vides ont été supprimées et à rejoindre toutes les chaînes de ce tableau. dans une nouvelle chaîne en les séparant par un caractère d'espacement.

Le code de Playground suivant montre comment procéder:

import Foundation

let string = "  Lorem   ipsum dolar   sit  amet. "

let newString = string
.componentsSeparatedByCharactersInSet(.whitespaceCharacterSet())
.filter { !$0.isEmpty }
.joinWithSeparator(" ") 

print(newString) // prints "Lorem ipsum dolar sit amet."

Si vous devez répéter cette opération, vous pouvez refactoriser votre code dans une extension String:

import Foundation

extension String {
    func condenseWhitespace() -> String {
        return componentsSeparatedByCharactersInSet(.whitespaceCharacterSet())
            .filter { !$0.isEmpty }
            .joinWithSeparator(" ")
    }
}

let string = "  Lorem   ipsum dolar   sit  amet. "
let newString = string.condenseWhitespace()

print(newString) // prints "Lorem ipsum dolar sit amet."

Cependant, avec Swift, il existe un autre moyen réellement fonctionnel qui ne nécessite pas l’importation de Foundation.

Les étapes ici consistent à obtenir de votre chaîne un tableau de String.CharacterView où tous les caractères d'espacement ont été supprimés, à mapper ce tableau de String.CharacterView à un tableau de String et à joindre toutes les chaînes de ce tableau dans une nouvelle chaîne tout en les séparant par un caractère d'espacement.

Le code de Playground suivant montre comment procéder:

let string = "  Lorem   ipsum dolar   sit  amet. "

let newString = string.characters
    .split { $0 == " " }
    .map { String($0) }
    .joinWithSeparator(" ")

print(newString) // prints "Lorem ipsum dolar sit amet."

Si vous devez répéter cette opération, vous pouvez refactoriser votre code dans une extension String:

extension String {
    func condenseWhitespace() -> String {
        return characters
            .split { $0 == " " }
            .map { String($0) }
            .joinWithSeparator(" ")
    }
}

let string = "  Lorem   ipsum dolar   sit  amet. "
let newString = string.condenseWhitespace()

print(newString) // prints "Lorem ipsum dolar sit amet."
4
Imanou Petit

Une autre option consiste à utiliser la recherche par expression régulière pour remplacer toutes les occurrences D'un ou de plusieurs caractères d'espacement par un seul espace . Exemple (Swift 3):

let string = "  Lorem   \r  ipsum dolar   sit  amet. "

let condensed = string
        .replacingOccurrences(of: "\\s+", with: " ", options: .regularExpression)
        .trimmingCharacters(in: .whitespacesAndNewlines)

print(condensed.debugDescription) // "Lorem ipsum dolar sit amet."
0
Martin R

Pour Swift 3.1

extension String {
    var trim : String {
        get {
            return characters
                .split { $0 == " " || $0 == "\r" }
                .map { String($0) }
                .joined(separator: " ")
        }
    }
}

let string = "  Lorem   \r  ipsum dolar   sit  amet. "
print(string.trim)

Est-ce que la sortie:

Lorem ipsum dolar sit amet.
0
Guillaume S