2016-09-16 4 views
0

У меня есть NSString, который я проверяю, есть ли NSLog, а затем я прокомментирую это. Я использую NSRegularExpression, а затем перебираю результат. Код:Цель C - NSRegularExpression с определенной подстрокой

-(NSString*)commentNSLogFromLine:(NSString*)lineStr { 

    NSString *regexStr [email protected]"NSLog\\(.*\\)[\\s]*\\;"; 

    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:regexStr options:NSRegularExpressionCaseInsensitive error:nil]; 

    NSArray *arrayOfAllMatches = [regex matchesInString:lineStr options:0 range:NSMakeRange(0, [lineStr length])]; 

    NSMutableString *mutStr = [[NSMutableString alloc]initWithString:lineStr]; 

    for (NSTextCheckingResult *textCheck in arrayOfAllMatches) { 

     if (textCheck) { 
      NSRange matchRange = [textCheck range]; 
      NSString *strToReplace = [lineStr substringWithRange:matchRange]; 
      NSString *commentedStr = [NSString stringWithFormat:@"/*%@*/",[lineStr substringWithRange:matchRange]]; 
      [mutStr replaceOccurrencesOfString:strToReplace withString:commentedStr options:NSCaseInsensitiveSearch range:matchRange]; 

      NSRange rOriginal = [mutStr rangeOfString:@"NSLog("]; 
      if (NSNotFound != rOriginal.location) { 
       [mutStr replaceOccurrencesOfString:@"NSLog(" withString:@"DSLog(" options:NSCaseInsensitiveSearch range:rOriginal]; 
      } 
     } 
    } 

    return [NSString stringWithString:mutStr]; 

} 

Проблема с тестового примера:

NSString *str = @"NSLog(@"A string"); NSLog(@"A string2")" 

Вместо возвращения "/*DSLog(@"A string");*/ /*DSLog(@"A string2")*/" возвращается: "/*DSLog(@"A string"); NSLog(@"A string2")*/".

Проблема заключается в том, как Objective-C обрабатывает регулярное выражение. Я ожидал бы 2 результата в arrayOfAllMatches, но вместо этого я получаю только один. Есть ли способ попросить Objective-C остановиться при первом вхождении );?

ответ

1

Проблема с регулярным выражением. Вы ищете. * В круглых скобках, что заставляет его включать первую закрывающуюся скобку, продолжить работу во втором заявлении NSLog и пройти весь путь до конечных закрытых круглых скобок.

Так что вы хотите сделать что-то вроде этого:

NSString *regexStr [email protected]"NSLog\\([^\\)]*\\)[\\s]*\\;"; 

Это говорит ему, чтобы включить все внутри скобок для символа), за исключением. Используя это регулярное выражение, я получаю два совпадения. (обратите внимание, что вы пропустили окончательный вариант, в своем примере строки).

 Смежные вопросы

  • Нет связанных вопросов^_^