Eliminar todos los espacios en blanco de NSString


134

He estado tratando de deshacerme de los espacios en blanco en un NSString, pero ninguno de los métodos que he probado funcionó.

Tengo "this is a test"y quiero llegar "thisisatest".

He usado whitespaceCharacterSet, que se supone que elimina los espacios en blanco.

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

pero seguí obteniendo la misma cadena con espacios. ¿Algunas ideas?


2
No hay una manera simple, pero este enlace tiene excelentes respuestas - stackoverflow.com/questions/758212/…
Coffee

2
@Adel Pero, no hay respuestas aceptadas =)
Almas Adilbek

Respuestas:


303

stringByTrimmingCharactersInSet solo elimina los caracteres del principio y el final de la cadena, no los del medio.

1) Si necesita eliminar solo un carácter dado (digamos el espacio) de su cadena, use:

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

2) Si realmente necesita eliminar un conjunto de caracteres (es decir, no solo el carácter de espacio, sino cualquier carácter de espacio en blanco como espacio, tabulación, espacio irrompible, etc.), puede dividir su cadena usando y whitespaceCharacterSetluego unir las palabras nuevamente en una cadena :

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

Tenga en cuenta que esta última solución tiene la ventaja de manejar todos los espacios en blanco y no solo los espacios, sino que es un poco menos eficiente que el stringByReplacingOccurrencesOfString:withString:. Entonces, si realmente solo necesita eliminar el carácter de espacio y está seguro de que no tendrá ningún otro carácter de espacio en blanco que el carácter de espacio en blanco, use el primer método.


¡Magnífico! ¡Muchas gracias!
iGatiTech

33

Prefiero usar expresiones regulares como esta:

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

Puede hacerse una categoría en NSString para hacer la vida aún más fácil:

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

}

Aquí hay un método de prueba de unidad también:

- (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 hombre, me gusta este negocio de pruebas unitarias incluidas. ¡Ahora no solo puedo copiar y pegar mi código desde SO, sino que también puedo copiar y pegar las pruebas para ese código!
TylerJames

13

Tarea fácil usando stringByReplacingOccurrencesOfString

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

1
De acuerdo, sin embargo, solo si no necesita el conjunto de espacios en blanco. Iba a usar eso, pero luego me di cuenta de que tenía nuevas líneas en mi cadena.
mobibob

7

Esto puede ayudarlo si está experimentando \u00a0en lugar de (espacios en blanco). Tuve este problema cuando intentaba extraer los números de teléfono de contacto del dispositivo. Necesitaba modificar la cadena phoneNumber para que no tenga espacios en blanco.

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

¿Cuándo yourStringfue el número de teléfono actual?


Esto ayudó mucho! ¡Estaba atrapado en eso también! ¡Muchas gracias hombre! : D
Rafi

Para yourString.replacingOccurrences(of: "\u{00a0}", with: "")
Swift

4

stringByReplacingOccurrencesOfString reemplazará todo el espacio en blanco en la cadena, no solo el inicio y el final

Utilizar

[YourString stringByTrimmingCharactersInSet:[NSCharacterSet  whitespaceAndNewlineCharacterSet]]

55
dices usar stringByReplacingOccurrencesOfStringpero da un ejemplo de stringByTrimmingCharactersInSet?
Flexicoder

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

Si bien este código puede resolver el problema, unas pocas palabras de explicación contribuirían en gran medida a que esta respuesta sea valiosa para los futuros lectores.
Thom

4

Esto para mí es la mejor manera 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)

y el resultado es: ciaociao

¡Pero el truco es este!

 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

Use debajo del marco y elimine el espacio.

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

en otro archivo, llame a TRIM:

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

Que te ayude ...


3

Eso es para eliminar cualquier espacio que sea cuando obtiene texto de cualquier campo de texto, pero si desea eliminar espacio entre cadenas, puede usar

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

Reemplazará el espacio vacío sin espacio y el campo vacío se ocupa del siguiente método:

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

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

Por favor, elabore un poco lo que hace este fragmento y arregle su formato.
Yurii

-2

Le sugiero que coloque esto en algún lugar de su proyecto:

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

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

1
Esta no es una respuesta a la pregunta.
Ben Lachman
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.