Видаліть всі пробіли з NSString


134

Я намагався позбутися білих просторів NSString, але жоден із методів, які я намагався, не працював.

Я маю "this is a test"і хочу отримати "thisisatest".

Я використовував whitespaceCharacterSet, який повинен ліквідувати пробіли.

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

але я продовжував отримувати ту саму струну з пробілами. Будь-які ідеї?


2
Існує не простий спосіб, але це посилання має чудові відповіді - stackoverflow.com/questions/758212/…
Кава

2
@Adel Але відповіді не прийняті =)
Almas Adilbek

Відповіді:


303

stringByTrimmingCharactersInSet видаляє лише символи на початку та в кінці рядка, а не ті, що знаходяться посередині.

1) Якщо вам потрібно видалити з заданого символу лише заданий символ (скажімо пробіл), використовуйте:

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

2) Якщо вам дійсно потрібно видалити набір символів (а саме не лише пробільний символ, але будь-який символ пробілу, наприклад пробіл, вкладка, нерозривний пробіл тощо), ви можете розділити рядок, використовуючи whitespaceCharacterSetпотім з'єднання слів знову в один рядок :

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

Зауважте, що це останнє рішення має перевагу в обробці кожного символу пробілу та не лише пробілів, але є трохи менш ефективним, ніж stringByReplacingOccurrencesOfString:withString:. Тож якщо вам дійсно потрібно лише видалити пробіл і впевнені, що у вас не буде іншого символу пробілу, крім простого пробілу, скористайтеся першим методом.


Чудово! Дуже дякую!
iGatiTech

33

Я вважаю за краще використовувати регулярний гекс так:

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

Ви можете зробити собі категорію на NSString, щоб зробити життя ще простішим:

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

}

Ось також метод одиничного тестування на ньому:

- (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
О людино, мені подобається, що це включало одиничні тести бізнесу. Тепер я не тільки можу скопіювати і вставити свій код з SO, але я можу також скопіювати і вставити тести для цього коду!
TylerJames

13

Просте використання завдання stringByReplacingOccurrencesOfString

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

1
Погодьтеся, однак, лише якщо вам не потрібен набір пробілів. Я збирався використати це, але потім зрозумів, що у мене є рядки в рядку.
mobibob

7

Це може допомогти вам, якщо ви переживаєте \u00a0замість (пробіл). У мене була ця проблема, коли я намагався витягнути телефонні номери пристрою. Мені потрібно було змінити рядок phoneNumber, щоб у ньому не було пробілів.

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

Коли yourStringбув поточний номер телефону.


Це допомогло тоні! Я на цьому теж застряг! Велике спасибі людино! : D
Рафі

Для швидкого 3 ви можете скористатисяyourString.replacingOccurrences(of: "\u{00a0}", with: "")
Охан Окбай

4

stringByReplacingOccurrencesOfString замінить весь пробіл на в рядку, не тільки початок і кінець

Використовуйте

[YourString stringByTrimmingCharactersInSet:[NSCharacterSet  whitespaceAndNewlineCharacterSet]]

5
ви кажете використовувати, stringByReplacingOccurrencesOfStringале наведіть приклад stringByTrimmingCharactersInSet?
Флексікодер

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

Хоча цей код може вирішити проблему, кілька пояснень пройдуть довгий шлях, щоб зробити цю відповідь цінною для майбутніх читачів.
Том

4

Це для мене найкращий спосіб 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)

і результат: ciaociao

Але фокус у цьому!

 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

Використовуйте нижче marco та видаліть простір.

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

в іншому файлі виклику TRIM:

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

Нехай це допоможе вам ...


3

Тобто для видалення будь-якого простору, коли ви отримуєте текст з будь-якого текстового поля, але якщо ви хочете видалити простір між рядками, ви можете використовувати

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

Він замінить порожній простір без місця, і про порожнє поле подбає наступний метод:

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

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

Будь ласка, детальніше розкажіть, що робить цей фрагмент, і виправте його форматування.
Юрій

-2

Я настійно пропоную розмістити це десь у вашому проекті:

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

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

1
Це не відповідь на запитання.
Бен Лакман
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.