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?

marsalal1014
źródło
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.

AliSoftware
źródło
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);
    }
}
n8tr
źródło
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:@""];
Youssef
źródło
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.

dvp.petrov
źródło
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]]
Siva Murugan
źródło
5
mówisz używać, stringByReplacingOccurrencesOfStringale podaj przykład stringByTrimmingCharactersInSet?
Flexicoder
4
- (NSString *)removeWhitespaces {
  return [[self componentsSeparatedByCharactersInSet:
                    [NSCharacterSet whitespaceCharacterSet]]
      componentsJoinedByString:@""];
}
Aqib Mumtaz
źródło
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
RobertoL
źródło
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 ...

Lider zespołu PALAK Mobile
źródło
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]];
anand madhav
źródło
-1
pStrTemp = [pStrTemp stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
Ela
źródło
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)
    }
}
Maury Markowitz
źródło
1
To nie jest odpowiedź na pytanie.
Ben Lachman