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

У меня есть следующий NSString:

Hello (my name is) John

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


person Ethan Allen    schedule 04.06.2013    source источник
comment
Проверьте stackoverflow. ком/вопросы/2493153/   -  person savner    schedule 04.06.2013
comment
Просто найдите индекс символов ( и ) и удалите все между ними (эй, это действительно то, о чем вы просили).   -  person    schedule 04.06.2013
comment
Кроме того, вам, вероятно, придется использовать какую-то рекурсию, если ваши скобки могут быть встроены друг в друга.   -  person    schedule 05.06.2013
comment
вы можете использовать регулярное выражение для этого.   -  person holex    schedule 02.12.2016


Ответы (3)


Если вы хотите удалить текст между скобками, тогда... удалите текст между скобками.

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

(повторяйте процесс, пока не появятся скобки)

person Community    schedule 04.06.2013
comment
@SanjitSaluja О, да ладно! Вы видели пример? Привет меня зовут Джон - person ; 05.06.2013
comment
Я считаю, что это может бросить, когда конец ‹ начало. - person Steve; 17.10.2015
comment
это, безусловно, приведет к сбою, если вы не проверите, что переменная строка не равна нулю или @ ... в этом случае вы жестко кодируете строку, чтобы она не сбой, но для многих, кто читает этот пост, у вас есть чтобы сначала убедиться, что ваша строка действительна. - person whyoz; 17.06.2016

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

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 = @"\\(.*?\\)";
person Sanjit Saluja    schedule 04.06.2013
comment
Это довольно элегантное и мощное решение. Но если ваша цель — строго то, о чем просили (ни больше, ни меньше), я бы выбрал решение H2CO3. Гораздо проще и, наверное, на порядок быстрее (если для вас это имеет значение). - person Guillaume Algis; 05.06.2013
comment
Я надеюсь, вы не будете советовать использовать регулярные выражения, когда в следующий раз захотите разобрать XML... (Честно говоря, есть случаи, когда регулярные выражения уместны, но я не верю, что это такая ситуация.) - person ; 05.06.2013
comment
Регулярные выражения не слишком хороши для сопоставления скобок. Это имеет и другие недостатки при вырожденном вводе, отличные от решения H2CO3. Он будет соответствовать двум словам в особом случае (круглые скобки (несоответствие). Это может быть или не быть тем, что вы хотите. - person morningstar; 05.06.2013

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

-(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;
}
person danypata    schedule 04.06.2013