Удалить все пробелы из NSString

134

Я пытался избавиться от пробелов в NSString, но ни один из методов, которые я пробовал, не работал.

У меня есть "this is a test"и я хочу получить "thisisatest".

Я использовал whitespaceCharacterSet, который должен устранить пробелы.

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

но я продолжал получать ту же строку с пробелами. Любые идеи?

marsalal1014
источник
2
Это не простой способ, но по этой ссылке есть отличные ответы - stackoverflow.com/questions/758212/…
Coffee
2
@ Адель Но, нет принятых ответов =)
Алмас Адильбек

Ответы:

303

stringByTrimmingCharactersInSet удаляет только символы в начале и конце строки, а не в середине.

1) Если вам нужно удалить только заданный символ (скажем, пробел) из вашей строки, используйте:

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

2) Если вам действительно нужно удалить набор символов (а именно не только символ пробела, но и любой символ пробела, например пробел, символ табуляции, неразрывный пробел и т. Д.), Вы можете разделить строку, используя whitespaceCharacterSetзатем объединение слов снова в одну строку :

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

Обратите внимание, что это последнее решение имеет преимущество обработки каждого символа пробела, а не только пробелов, но немного менее эффективно, чем stringByReplacingOccurrencesOfString:withString:. Поэтому, если вам действительно нужно удалить символ пробела и вы уверены, что у вас не будет другого символа пробела, кроме символа пробела, используйте первый метод.

AliSoftware
источник
Superb! Большое спасибо!
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);
    }
}
n8tr
источник
2
О, чувак, мне нравится этот бизнес модульных тестов. Теперь я не только могу скопировать и вставить свой код из SO, но я также могу скопировать и вставить тесты для этого кода!
TylerJames
13

Простое использование задачи stringByReplacingOccurrencesOfString

NSString *search = [searchbar.text stringByReplacingOccurrencesOfString:@" " withString:@""];
Юсеф
источник
1
Согласитесь, однако, только если вам не нужен набор пробелов. Я собирался использовать это, но потом понял, что в моей строке есть новые строки.
Мобибоб
7

Это может помочь вам, если вы испытываете \u00a0вместо (пробел). У меня была эта проблема, когда я пытался извлечь номера контактных телефонов устройства. Мне нужно было изменить строку phoneNumber, чтобы в ней не было пробелов.

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

Когда yourStringбыл текущий номер телефона.

dvp.petrov
источник
Это очень помогло! Я тоже застрял на этом! Большое спасибо, человек! : D
Рафи
Для Swift 3 вы можете использоватьyourString.replacingOccurrences(of: "\u{00a0}", with: "")
Okhan Okbay
4

stringByReplacingOccurferencesOfString заменит все пробелы в строке, а не только начало и конец

использование

[YourString stringByTrimmingCharactersInSet:[NSCharacterSet  whitespaceAndNewlineCharacterSet]]
Шива Муруган
источник
5
Вы говорите, чтобы использовать, stringByReplacingOccurrencesOfStringно привести пример stringByTrimmingCharactersInSet?
Flexicoder
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
RobertoL
источник
4

Используйте ниже marco и удалите пробел.

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

в другом файле вызов TRIM:

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

Пусть это поможет вам ...

Лидер мобильной команды PALAK
источник
3

Это для удаления любого пробела, когда вы получаете текст из любого текстового поля, но если вы хотите удалить пробел между строками, вы можете использовать

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

Он заменит пустое пространство без пробела, и пустое поле будет обработано с помощью метода ниже:

searchbar.text=[searchbar.text stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceCharacterSet]];
ананд мадхав
источник
-1
pStrTemp = [pStrTemp stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
Ela
источник
Пожалуйста, опишите немного, что делает этот фрагмент и исправьте его форматирование.
Юрий
-2

Я настоятельно рекомендую разместить это где-нибудь в вашем проекте:

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

    func trim(withSet: NSCharacterSet) -> String {
        return self.stringByTrimmingCharactersInSet(withSet)
    }
}
Мори Марковиц
источник
1
Это не ответ на вопрос.
Бен Лахман