2013-06-04 61 views
5

我有以下的NSString:如何刪除在我的NSString中有括號()的任何子字符串?

Hello (my name is) John 

如何快速,方便地去除(my name is)一部分?我想確保它處理的情況只有(,然後是),並且不會在其他任何情況下崩潰。如果你想括號內刪除文字,然後......嗯,括號中的文字去除

-(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; 
} 
+0

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

+1

找到'('和')'字符的索引並刪除它們之間的所有內容(嘿,這實際上就是你問的)。 – 2013-06-04 19:58:46

+1

另外,如果你的括號可以相互嵌入,你可能將不得不使用某種遞歸。 – 2013-06-04 20:04:14

回答

8

+1

@SanjitSaluja哦,來吧!你看到了這個例子? 「你好(我的名字是)約翰」 – 2013-06-04 20:49:11

+2

我相信這可能會在結束<開始時拋出。 – Steve

+0

如果你沒有檢查變量字符串是否爲零或@「」,這肯定會崩潰......在這種情況下,你正在對一個字符串進行硬編碼,所以它不會崩潰,但是對於很多閱讀本文的人來說,你必須檢查你的字符串是否有效。 – whyoz

0

如果你的文字有()不止出現一次,你可以嘗試像。

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

(重複過程,直到有括號)

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時,您不會建議使用正則表達式......(老實說,有些情況下正則表達式是適當的,但我不認爲這是這種情況。) – 2013-06-04 20:43:42

+3

正則表達式對於paren匹配不太好。與H 2 CO 3溶液不同,退化輸入還存在其他缺點。它將匹配「特殊情況下的兩個單詞(括號(不匹配)」。這可能是也可能不是你想要的。 – morningstar

相關問題