2013-06-04 4 views
5

Ich habe folgendes NSString:Wie kann ich einen Teilstring mit Klammern() in meinem NSString entfernen?

Hello (my name is) John 

Wie entferne ich den (my name is) Teil schnell und einfach? Ich möchte sicherstellen, dass es Situationen behandelt, in denen es nur eine ( und dann eine folgende ) gibt und nicht auf etwas anderes abstürzt.

+0

Überprüfen Sie http://stackoverflow.com/questions/2493153/search-for-a-string-between-two-known-strings – savner

+1

Finden Sie einfach den Index der '(' und ')' Zeichen und entfernen Sie alles dazwischen (hey, das ist nur wirklich das, was Sie gefragt haben). –

+1

Sie müssen wahrscheinlich auch eine Art Rekursion verwenden, wenn Ihre Klammern ineinander eingebettet werden können. –

Antwort

8

Wenn Sie Text in Klammern entfernen mögen, dann ... na ja, entfernen Sie Text in Klammern.

NSMutableString *s = [NSMutableString stringWithString:@"Hello (my name is) John"]; 
NSRange start = [s rangeOfString:@"("]; 
NSRange end = [s rangeOfString:@")"]; 
[s deleteCharactersInRange:(NSRange){ start.location, end.location - start.location + 1}]; 

(Vorgang wiederholen, bis es Pars sind)

+1

@SanjitSaluja Ach komm schon! Du hast das Beispiel gesehen? "Hallo (mein Name ist) John" –

+2

Ich glaube, das kann beim Ende Steve

+0

Dies wird sicherlich zum Absturz führen, wenn Sie nicht überprüfen, ob eine variable Zeichenkette nicht nil ist oder @ "" ... in diesem Fall schreiben Sie eine Zeichenkette hart, so dass sie nicht abstürzt, aber für viele, die diesen Beitrag lesen , müssen Sie überprüfen, ob Ihre Zeichenfolge zuerst gültig ist. – whyoz

0

Wenn der Text mehr als ein Auftreten von () haben Sie könnten versuchen, so etwas wie:

-(NSString *)clearString:(NSString *)stringToClear { 
    while([stringToClear rangeOfString:@"("].location != NSNotFound) { 
      NSRange firstRange = [stringToClear rangeOfString:@"("]; 
      NSRange secondRange = [stringToClear rangeOfString:@")"]; 
      stringToClear = [stringToClear stringByReplacingCharactersInRange: 
           NSMakeRange(firstRange.location, secondRange.location) 
         withString:@""]; 
    } 
    return stringToClear; 
} 
6

Einfache reguläre Ausdrücke zu tun mit (gierig):

NSError *error = NULL; 
NSString *stringToBeReplaced = @"Hello (my name is) John"; 
NSString *regexString = @"\\(.*\\)"; 
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:regexString options:NSRegularExpressionCaseInsensitive error:&error]; 
NSString *modifiedString = [regex stringByReplacingMatchesInString:stringToBeReplaced options:0 range:NSMakeRange(0, [stringToBeReplaced length]) withTemplate:@""]; 
// Greedy means it will match "My name (is John) (Jobs)." => "My name ." 

Für eine nicht-gierigen regulären Ausdruck:

NSString *regex = @"\\(.*?\\)"; 
+2

Dies ist eine ziemlich elegante und leistungsstarke Lösung. Aber wenn Ihr Ziel genau das ist, was gefragt wurde (nicht mehr und nicht weniger), würde ich mit der Lösung von H2CO3 gehen. Viel einfacher und wahrscheinlich eine Größenordnung schneller (wenn es Ihnen wichtig ist). –

+1

Ich hoffe, Sie werden die Verwendung von regulären Ausdrücken nicht empfehlen, wenn Sie das nächste Mal XML analysieren wollen ... (Ehrlich gesagt, es gibt Fälle, in denen Regexes geeignet sind, aber ich glaube nicht, dass dies eine solche Situation ist.) –

+3

Regexes sind nicht gut für Paren-Matching. Dies hat andere Nachteile bei der entarteten Eingabe, die sich von der H2CO3-Lösung unterscheidet. Es wird zwei Wörter in "Sonderfall (Klammern (nicht übereinstimmend)") übereinstimmen. Das könnte oder könnte nicht sein, was Sie wollen. – morningstar

Verwandte Themen