2013-06-04 1 views
5

У меня есть следующий NSString:Как удалить любую подстроку с круглыми скобками() в моей NSString?

Hello (my name is) John 

Как удалить (my name is) часть быстро и легко? Я хочу убедиться, что он обрабатывает ситуации, когда есть только (, а затем следующее ) и не падает ни на что другое.

+0

Ознакомьтесь с http://stackoverflow.com/questions/2493153/search-for-a-string-between-two-known-strings – savner

+1

Просто найдите индекс символов '(' и ')' и удалите все между ними (эй, это именно то, что вы просили). –

+1

Кроме того, вам, вероятно, придется использовать какую-то рекурсию, если ваши круглые скобки могут быть встроены друг в друга. –

ответ

8

Если вы хотите, чтобы удалить текст в скобках, а затем ... ну, удалите текст в скобках.

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

(процесс повтора, пока не круглые скобки)

+1

@SanjitSaluja Ну давай! Вы видели пример? «Привет (мое имя) Джон» –

+2

Я считаю, что это может произойти, когда конец <старт. – Steve

+0

это, безусловно, сбой, если вы не будете проверять, что переменная строка не равна nil или @ "" ... в этом случае вы жестко кодируете строку, чтобы она не разбивалась, но для многих, кто читал это сообщение , вы должны сначала проверить правильность своей строки. – whyoz

0

Если текст имеет более чем одно вхождение () вы могли бы попробовать что-то вроде:

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

легко сделать с помощью регулярных выражений (жадный):

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

Для нежадным регулярного использования выражения:

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

Это довольно элегантное и мощное решение. Но если ваша цель строго в том, что было задано (не больше, не меньше), я бы пошел с решением H2CO3. Гораздо проще и, вероятно, на порядок быстрее (если это важно для вас). –

+1

Надеюсь, вы не собираетесь советовать использовать регулярные выражения, когда в следующий раз вы захотите разобрать XML ... (Честно говоря, бывают случаи, когда регулярные выражения подходят, но я не считаю, что это такая ситуация.) –

+3

Регулярные выражения не слишком хороши для парного сопоставления. Это имеет и другие недостатки в отношении вырожденного ввода, отличного от решения H2CO3. Он будет соответствовать двум словам в «специальном случае (круглые скобки (несоответствие)». Это может быть или не быть тем, что вы хотите. – morningstar