Supprimer tous les espaces de NSString


134

J'ai essayé de me débarrasser des espaces blancs dans un NSString, mais aucune des méthodes que j'ai essayées n'a fonctionné.

J'ai "this is a test"et je veux obtenir "thisisatest".

J'ai utilisé whitespaceCharacterSet, qui est censé éliminer les espaces blancs.

NSString *search = [searchbar.text stringByTrimmingCharactersInSet:
                           [NSCharacterSet whitespaceCharacterSet]];

mais j'ai continué à obtenir la même chaîne avec des espaces. Des idées?


2
Il n'y a pas de moyen simple, mais ce lien a d'excellentes réponses - stackoverflow.com/questions/758212/...
Café

2
@Adel Mais, pas de réponses acceptées =)
Almas Adilbek

Réponses:


303

stringByTrimmingCharactersInSet supprime uniquement les caractères du début et de la fin de la chaîne, pas ceux du milieu.

1) Si vous devez supprimer uniquement un caractère donné (par exemple le caractère espace) de votre chaîne, utilisez:

[yourString stringByReplacingOccurrencesOfString:@" " withString:@""]

2) Si vous avez vraiment besoin de supprimer un ensemble de caractères (à savoir non seulement le caractère espace, mais tout caractère d'espace blanc comme l'espace, la tabulation, l'espace incassable, etc.), vous pouvez diviser votre chaîne en utilisant le whitespaceCharacterSetpuis en joignant à nouveau les mots dans une chaîne :

NSArray* words = [yourString componentsSeparatedByCharactersInSet :[NSCharacterSet whitespaceAndNewlineCharacterSet]];
NSString* nospacestring = [words componentsJoinedByString:@""];

Notez que cette dernière solution a l'avantage de gérer tous les caractères d'espacement et pas seulement les espaces, mais est un peu moins efficace que le stringByReplacingOccurrencesOfString:withString:. Donc, si vous n'avez vraiment besoin que de supprimer le caractère espace et que vous êtes sûr de ne pas avoir d'autre caractère d'espacement que le caractère espace simple, utilisez la première méthode.


Superbe! Merci beaucoup!
iGatiTech

33

Je préfère utiliser des regex comme ceci:

NSString *myString = @"this is a test";
NSString *myNewString = [myString stringByReplacingOccurrencesOfString:@"\\s"
                                     withString:@""
                                        options:NSRegularExpressionSearch
                                          range:NSMakeRange(0, [myStringlength])];
 //myNewString will be @"thisisatest"

Vous pouvez créer une catégorie sur NSString pour vous simplifier la vie:

- (NSString *) removeAllWhitespace
{
    return [self stringByReplacingOccurrencesOfString:@"\\s" withString:@""
                                              options:NSRegularExpressionSearch
                                                range:NSMakeRange(0, [self length])];

}

Voici aussi une méthode de test unitaire là-dessus:

- (void) testRemoveAllWhitespace
{
    NSString *testResult = nil;

    NSArray *testStringsArray        = @[@""
                                         ,@"    "
                                         ,@"  basicTest    "
                                         ,@"  another Test \n"
                                         ,@"a b c d e f g"
                                         ,@"\n\tA\t\t \t \nB    \f  C \t  ,d,\ve   F\r\r\r"
                                         ,@"  landscape, portrait,     ,,,up_side-down   ;asdf;  lkjfasdf0qi4jr0213 ua;;;;af!@@##$$ %^^ & *  * ()+  +   "
                                         ];

    NSArray *expectedResultsArray   = @[@""
                                        ,@""
                                        ,@"basicTest"
                                        ,@"anotherTest"
                                        ,@"abcdefg"
                                        ,@"ABC,d,eF"
                                        ,@"landscape,portrait,,,,up_side-down;asdf;lkjfasdf0qi4jr0213ua;;;;af!@@##$$%^^&**()++"
                                        ];

    for (int i=0; i < [testStringsArray count]; i++)
    {
        testResult = [testStringsArray[i] removeAllWhitespace];
        STAssertTrue([testResult isEqualToString:expectedResultsArray[i]], @"Expected: \"%@\" to become: \"%@\", but result was \"%@\"",
                     testStringsArray[i], expectedResultsArray[i], testResult);
    }
}

2
Oh mec, j'aime ça, y compris les tests unitaires. Maintenant, non seulement je peux copier-coller mon code depuis SO, mais je peux aussi copier-coller les tests pour ce code!
TylerJames

13

Tâche facile en utilisant stringByReplacingOccurrencesOfString

NSString *search = [searchbar.text stringByReplacingOccurrencesOfString:@" " withString:@""];

1
N'acceptez, cependant, que si vous n'avez pas besoin de l'ensemble d'espaces. J'allais l'utiliser, mais j'ai ensuite réalisé que j'avais des nouvelles lignes dans ma chaîne.
mobibob

7

Cela peut vous aider si vous rencontrez des \u00a0problèmes au lieu de (espace blanc). J'ai eu ce problème lorsque j'essayais d'extraire les numéros de téléphone de contact de l'appareil. J'avais besoin de modifier la chaîne phoneNumber pour qu'elle ne contienne aucun espace.

NSString* yourString = [yourString stringByReplacingOccurrencesOfString:@"\u00a0" withString:@""];

Quand yourStringétait le numéro de téléphone actuel.


Cela a aidé une tonne! J'étais coincé là-dessus aussi! Merci beaucoup mec! : D
Rafi

Pour Swift 3, vous pouvez utiliseryourString.replacingOccurrences(of: "\u{00a0}", with: "")
Okhan Okbay

4

stringByReplacingOccurrencesOfString remplacera tous les espaces blancs par dans la chaîne non seulement le début et la fin

Utilisation

[YourString stringByTrimmingCharactersInSet:[NSCharacterSet  whitespaceAndNewlineCharacterSet]]

5
vous dites d'utiliser stringByReplacingOccurrencesOfStringmais donnez un exemple de stringByTrimmingCharactersInSet?
Flexicoder

4
- (NSString *)removeWhitespaces {
  return [[self componentsSeparatedByCharactersInSet:
                    [NSCharacterSet whitespaceCharacterSet]]
      componentsJoinedByString:@""];
}

Bien que ce code puisse résoudre le problème, quelques mots d'explication contribueraient grandement à rendre cette réponse intéressante pour les futurs lecteurs.
Thom

4

C'est pour moi la meilleure façon SWIFT

        let myString = "  ciao   \n              ciao     "
        var finalString = myString as NSString

        for character in myString{
        if character == " "{

            finalString = finalString.stringByReplacingOccurrencesOfString(" ", withString: "")

        }else{
            finalString = finalString.stringByReplacingOccurrencesOfString("\n", withString: "")

        }

    }
     println(finalString)

et le résultat est: ciaociao

Mais le truc est le suivant!

 extension String {

    var NoWhiteSpace : String {

    var miaStringa = self as NSString

    if miaStringa.containsString(" "){

      miaStringa =  miaStringa.stringByReplacingOccurrencesOfString(" ", withString: "")
    }
        return miaStringa as String

    }
}

let myString = "Ciao   Ciao       Ciao".NoWhiteSpace  //CiaoCiaoCiao

4

Utilisez ci-dessous marco et supprimez l'espace.

#define TRIMWHITESPACE(string) [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]

dans un autre fichier, appelez TRIM:

    NSString *strEmail;
    strEmail = TRIM(@"     this is the test.");

Puisse-t-il vous aider ...


3

C'est pour supprimer tout espace lorsque vous obtenez du texte à partir de n'importe quel champ de texte, mais si vous souhaitez supprimer l'espace entre la chaîne, vous pouvez utiliser

xyz =[xyz.text stringByReplacingOccurrencesOfString:@" " withString:@""];

Il remplacera l'espace vide par aucun espace et le champ vide est pris en charge par la méthode ci-dessous:

searchbar.text=[searchbar.text stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceCharacterSet]];

-1
pStrTemp = [pStrTemp stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

Veuillez expliquer un peu ce que fait cet extrait de code et corriger sa mise en forme.
Yurii

-2

Je suggère fortement de placer ceci quelque part dans votre projet:

extension String {
    func trim() -> String {
        return self.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())
    }

    func trim(withSet: NSCharacterSet) -> String {
        return self.stringByTrimmingCharactersInSet(withSet)
    }
}

1
Ce n'est pas une réponse à la question.
Ben Lachman
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.