Usuń wszystkie spacje z NSString


134

Próbowałem pozbyć się białych spacji w pliku NSString , ale żadna z metod, które wypróbowałem, nie zadziałała.

Mam "this is a test"i chcę dostać "thisisatest".

Użyłem whitespaceCharacterSet, co ma wyeliminować białe spacje.

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

ale otrzymywałem ten sam ciąg ze spacjami. Jakieś pomysły?


2
Nie ma prostego sposobu, ale ten link ma świetne odpowiedzi - stackoverflow.com/questions/758212/…
Kawa

2
@Adel Ale brak zaakceptowanych odpowiedzi =)
Almas Adilbek

Odpowiedzi:


303

stringByTrimmingCharactersInSet usuwa tylko znaki z początku i końca ciągu, a nie te ze środka.

1) Jeśli chcesz usunąć tylko dany znak (np. Spację) ze swojego ciągu, użyj:

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

2) Jeśli naprawdę potrzebujesz usunąć zestaw znaków (a mianowicie nie tylko znak spacji, ale wszelkie białe znaki, takie jak spacja, tabulator, nierozerwalna spacja itp.), Możesz podzielić swój ciąg, używając whitespaceCharacterSetnastępnie ponownie łącząc słowa w jeden ciąg :

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

Zauważ, że to ostatnie rozwiązanie ma tę zaletę, że obsługuje wszystkie białe znaki, a nie tylko spacje, ale jest nieco mniej wydajne niż stringByReplacingOccurrencesOfString:withString:. Więc jeśli naprawdę potrzebujesz tylko usunąć znak spacji i jesteś pewien, że nie będziesz mieć żadnego innego białego znaku niż zwykły znak spacji, użyj pierwszej metody.


Wspaniały! Wielkie dzięki!
iGatiTech

33

Wolę używać wyrażeń regularnych w ten sposób:

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

Możesz stworzyć sobie kategorię w NSString, aby życie było jeszcze łatwiejsze:

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

}

Oto również metoda testów jednostkowych:

- (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
O rany, podoba mi się to, w tym biznes testów jednostkowych. Teraz nie tylko mogę skopiować i wkleić mój kod z SO, ale mogę również skopiować i wkleić testy dla tego kodu!
TylerJames

13

Łatwe zadanie w użyciu stringByReplacingOccurrencesOfString

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

1
Zgadzam się jednak tylko wtedy, gdy nie potrzebujesz zestawu białych znaków. Zamierzałem tego użyć, ale potem zdałem sobie sprawę, że mam nowe linie w moim ciągu.
mobibob

7

Może ci to pomóc, jeśli \u00a0zamiast (białe spacje). Miałem ten problem, gdy próbowałem wyodrębnić kontaktowe numery telefonów urządzenia. Musiałem zmodyfikować ciąg phoneNumber, aby nie zawierał spacji.

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

Kiedy yourStringbył obecny numer telefonu.


To pomogło tonie! Ja też na tym utknąłem! Dzięki wielkie! : D
Rafi

Dla Swift 3 możesz użyćyourString.replacingOccurrences(of: "\u{00a0}", with: "")
Okhan Okbay

4

stringByReplacingOccurrencesOfString zastąpi wszystkie białe znaki w ciągu nie tylko początkiem i końcem

Posługiwać się

[YourString stringByTrimmingCharactersInSet:[NSCharacterSet  whitespaceAndNewlineCharacterSet]]

5
mówisz używać, stringByReplacingOccurrencesOfStringale podaj przykład stringByTrimmingCharactersInSet?
Flexicoder

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

Chociaż ten kod może rozwiązać problem, kilka słów wyjaśnienia znacznie przyczyniłoby się do uczynienia tej odpowiedzi wartościową dla przyszłych czytelników.
Thom

4

To dla mnie najlepszy sposób 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)

a wynik to: ciaociao

Ale sztuczka jest taka!

 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

Użyj poniżej marco i usuń spację.

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

w innym pliku wywołanie TRIM:

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

Niech ci pomoże ...


3

To jest do usuwania spacji, która pojawia się podczas pobierania tekstu z dowolnego pola tekstowego, ale jeśli chcesz usunąć spację między ciągiem, możesz użyć

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

Zastąpi puste miejsce bez spacji, a puste pole jest obsługiwane następującą metodą:

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

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

Opowiedz trochę o tym, co robi ten fragment kodu i popraw jego formatowanie.
Yurii,

-2

Zdecydowanie sugeruję umieszczenie tego gdzieś w swoim projekcie:

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

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

1
To nie jest odpowiedź na pytanie.
Ben Lachman
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.