如何删除NSString中包含括号()的子字符串?

Eth*_*len 5 cocoa-touch objective-c nsstring ios nsrange

我有以下NSString:

Hello (my name is) John
Run Code Online (Sandbox Code Playgroud)

如何(my name is)快速轻松地拆卸零件?我想确保它处理只有a (然后跟随)并且不会崩溃的情况.

小智 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}];
Run Code Online (Sandbox Code Playgroud)

(重复过程,直到有parens)

  • 我相信这可能会在结束时开始. (2认同)

San*_*uja 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 ."
Run Code Online (Sandbox Code Playgroud)

对于非贪婪的正则表达式,请使用:

NSString *regex = @"\\(.*?\\)";
Run Code Online (Sandbox Code Playgroud)

  • 正则表达式对于匹配匹配并不太好.这与退化输入有其他缺点,不同于H2CO3的解决方案.它将匹配"特殊情况(括号(不匹配)"中的两个单词.这可能是也可能不是你想要的. (3认同)
  • 这是一个非常优雅和强大的解决方案.但如果你的目标严格要求(不多也不少),我会选择H2CO3的解决方案.更简单,可能快一个数量级(如果对你很重要). (2认同)