2009-06-17 9 views
16

Comment puis-je supprimer le premier caractère \ n d'un NSString? Editer: Juste pour clarifier, ce que je voudrais faire est: Si la première ligne de la chaîne contient un caractère \ n, supprimez-le sinon ne faites rien.Supprimer un caractère de nouvelle ligne de la première ligne de NSString

-à-dire: Si la chaîne est comme ceci:

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

et opposée à une chaîne qui ne contient pas un saut de ligne dans la première ligne:

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

J'espère que rend plus clair .

+0

Votre modification rend la question moins claire. D'un point de vue conceptuel, "la première ligne d'une chaîne", si tant est que ce soit, signifierait pour moi tous les caractères jusqu'à (et peut-être y compris) le premier saut de ligne de la chaîne. Si vous voulez dire quelque chose d'autre que cela par "première ligne", vous devrez peut-être clarifier à nouveau. –

+0

Ce que Quinn a dit. Par définition, la première ligne doit contenir une nouvelle ligne. Sinon, la chaîne n'a qu'une seule ligne. – Chuck

Répondre

11

Cela devrait faire l'affaire:

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

Cela a l'inconvénient de (1) renvoyer une chaîne mutable ou (2) nécessitant une copie immuable pour éviter cela. Utilisez -stringByReplacingOccurrencesOfString: withString: options: range: pour le faire plus efficacement. Ma réponse comprend des détails et un exemple de code. –

39
[string stringByTrimmingCharactersInSet:[NSCharacterSet newlineCharacterSet]] 

sera couper votre chaîne de toute sorte de nouvelles lignes, si c'est ce que vous voulez.

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

fera exactement ce que vous demandez et supprimer newline si c'est le premier caractère de la chaîne

+1

options: nul ne devrait être des options: 0 –

+0

nil == NULL == 0 en C++. nil == NULL == (void *) 0 dans C. NSStringCompareOptions est typedef NSUInteger qui est 32 bits sur les plates-formes 32 bits et 64 bits sur les plates-formes 64 bits. Les littéraux entiers à la place des constantes nommées vont à l'encontre de mes sensibilités;) – monowerker

+1

@monowerker: Ce n'est pas C++. Je réalise que nul est simplement défini comme zéro. Le compilateur Xcode pour une raison quelconque dans 3.0 vous donne un avertissement, en utilisant 0 corrige cela. Bizarre, mais c'est ce qui arrive. –

6

Plutôt que de créer un NSMutableString et en utilisant quelques conserver/libérer des appels, vous pouvez utiliser uniquement la chaîne d'origine et simplifier le code en utilisant ce qui suit à la place: (nécessite 10.5+)

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

(Voir -stringByReplacingOccurrencesOfString:withString:options:range: pour plus de détails.)

Le résultat du dernier appel de la méthode d'appel peut même être en toute sécurité réaffecté à d'origine si vous AutoRelease ce qui est là d'abord si vous ne fuit pas la mémoire.

+0

+1 C'est beaucoup mieux que ma solution. Cette méthode particulière n'est disponible que dans la version 10.5 et plus, mais cela devrait être la plupart des systèmes maintenant, avec 10.6 qui sortira bientôt. –

+0

Excellente prise sur 10.5+ pour cette méthode, j'avais oublié cela.J'ai la chance de ne plus avoir à m'inquiéter du soutien de Tiger. :-) –

Questions connexes