2009-06-17 15 views
16

¿Cómo puedo eliminar el primer carácter \ n de un NSString?Eliminar carácter de nueva línea de la primera línea de NSString

Editar: Solo para aclarar, lo que me gustaría hacer es: Si la primera línea de la cadena contiene un carácter \ n, elimínelo para no hacer nada.

es decir: Si la cadena es la siguiente:

@"\nhello, this is the first line\nthis is the second line" 

y opuesta a una cadena que no contiene una nueva línea en la primera línea:

@"hello, this is the first line\nthis is the second line." 

espero que hace que sea más clara .

+0

Su edición realmente deja la pregunta menos clara. Conceptualmente, "la primera línea de una cadena", si acaso, significaría para mí todos los caracteres hasta (y quizás incluyendo) la primera nueva línea en la cadena. Si te refieres a algo más que eso por "primera línea", es posible que necesites aclararlo nuevamente. –

+0

Lo que dijo Quinn. Por definición, la primera línea debe contener una nueva línea. De lo contrario, la cadena tiene solo una línea. – Chuck

Respuesta

11

Esto debería hacer el truco:

NSString * ReplaceFirstNewLine(NSString * original) 
{ 
    NSMutableString * newString = [NSMutableString stringWithString:original]; 

    NSRange foundRange = [original rangeOfString:@"\n"]; 
    if (foundRange.location != NSNotFound) 
    { 
     [newString replaceCharactersInRange:foundRange 
           withString:@""]; 
    } 

    return [[newString retain] autorelease]; 
} 
+3

Esto tiene la desventaja de (1) devolver una cadena mutable o (2) requerir una copia inmutable para evitar eso. Use -stringByReplacingOccurrencesOfString: withString: options: range: para hacer esto de manera más eficiente. Mi respuesta incluye detalles y una muestra de código. –

39
[string stringByTrimmingCharactersInSet:[NSCharacterSet newlineCharacterSet]] 

recortarán su cadena de cualquier tipo de líneas nuevas, si eso es lo que desea.

[string stringByReplacingOccurrencesOfString:@"\n" withString:@"" options:0 range:NSMakeRange(0, 1)] 

hará exactamente lo que pide y eliminar salto de línea si es el primer carácter de la cadena

+1

opciones: nil debería ser opciones: 0 –

+0

nil == NULL == 0 en C++. nil == NULL == (void *) 0 en C. NSStringCompareOptions es typedef NSUInteger que es de 32 bits en plataformas de 32 bits y de 64 bits en plataformas de 64 bits. Los literales enteros en lugar de las constantes con nombre van en contra de mis sensibilidades;) – monowerker

+1

@monowerker: Esto no es C++. Me doy cuenta de que nil simplemente se define como cero. El compilador de Xcode por alguna razón en 3.0 le da una advertencia, usando 0 corrige esto. Raro, pero eso es lo que sucede. –

6

En lugar de crear un NSMutableString y el uso de unos pocos retener/liberar llamadas, puede usar solo la cadena original y simplificar el código utilizando en su lugar lo siguiente: (requiere 10.5+)

NSRange foundRange = [original rangeOfString:@"\n"]; 
if (foundRange.location != NSNotFound) 
    [original stringByReplacingOccurrencesOfString:@"\n" 
             withString:@"" 
              options:0 
              range:foundRange]; 

(Ver -stringByReplacingOccurrencesOfString:withString:options:range: para más detalles.)

El resultado de la última llamada al método llamada incluso se pueden asignar con seguridad de vuelta al original, SI que AutoRelease lo que hay allí primero para que no se escapan de la memoria.

+0

+1 Esto es mucho mejor que mi solución. Ese método particular solo está disponible en la versión 10.5 en adelante, pero eso debería ser la mayoría de los sistemas hasta ahora, con 10.6 saliendo pronto. –

+0

Excelente captura en 10.5+ para este método, lo había olvidado.Tengo la suerte de no tener que preocuparme más por el soporte de Tiger. :-) –

Cuestiones relacionadas