2013-06-04 23 views
5

Mam następujący NSString:Jak usunąć z mojego NSStringa dowolny podciąg, który ma nawiasy()?

Hello (my name is) John 

Jak mogę usunąć (my name is) część szybko i łatwo? Chcę się upewnić, że obsługuje sytuacje, w których występuje tylko (, a następnie następujące ) i nie ulega awarii na nic innego.

+0

Sprawdź http://stackoverflow.com/questions/2493153/search-for-a-string-between- two-known-strings – savner

+1

Po prostu znajdź indeks znaków '(' i ')' i usuń wszystko pomiędzy (hej, to jest po prostu to, o co prosiłeś). –

+1

Prawdopodobnie będziesz musiał użyć jakiegoś rekursji, jeśli nawiasy mogą być osadzone w sobie nawzajem. –

Odpowiedz

8

Jeśli chcesz usunąć tekst w nawiasach, to ... dobrze, usunąć tekst w nawiasach.

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}]; 

(powtórz proces, dopóki nie są nawiasy)

+1

@SanjitSaluja Och, daj spokój! Widziałeś przykład? "Witaj (mam na imię) John" –

+2

Wierzę, że może to spowodować, gdy koniec Steve

+0

to z pewnością zawiedzie, jeśli nie zaznaczysz, że ciąg zmiennej nie jest zerowy lub @ "" ... w tym przypadku, kodujesz ciąg znaków tak, aby się nie zawiesił, ale dla wielu czytających ten wpis , musisz sprawdzić, czy twój ciąg jest ważny jako pierwszy. – whyoz

0

Jeżeli tekst ma więcej niż jedno wystąpienie () można spróbować coś takiego:

-(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

Łatwo zrobić za pomocą wyrażeń regularnych (chciwy):

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 ." 

Dla non-chciwych regularnego stosowania ekspresji:

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

To dość eleganckie i wydajne rozwiązanie. Ale jeśli twoim celem jest dokładnie to, o co go proszono (nie więcej, nie mniej), wybrałbym rozwiązanie H2CO3. O wiele prostsze i prawdopodobnie o rząd wielkości szybsze (jeśli jest to dla ciebie ważne). –

+1

Mam nadzieję, że nie zalecisz używania wyrażeń regularnych, gdy następnym razem będziesz chciał parsować XML ... (szczerze mówiąc, są przypadki, gdy wyjustowanie jest odpowiednie, ale nie sądzę, że taka jest sytuacja). –

+3

Regeksy nie są zbyt dobre do dopasowania paren. Ma to inne wady w przypadku zdegenerowanych danych wejściowych innych niż roztwór H2CO3. Dopasuje dwa słowa w "specjalnym przypadku (nawiasy (niedopasowane)". Może to być lub nie być to, czego chcesz. – morningstar