2016-09-16 4 views
0

나는 NSLog이 있는지 확인하기 위해 NSString을 확인한 다음 주석 처리합니다. 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]; 

} 

문제는 테스트 케이스이다 : 대신 반환 "/*DSLog(@"A string");*/ /*DSLog(@"A string2")*/"를 반환

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

: "/*DSLog(@"A string"); NSLog(@"A string2")*/".

문제는 Objective-C이 정규식을 처리하는 방법입니다. 나는 arrayOfAllMatches에 2 개의 결과를 기대할 것이지만 대신에 나는 하나만 얻는다. 에게 );의 첫 번째 발생을 중지하도록 요청할 수있는 방법이 있습니까?

답변

1

문제는 정규 표현식에 있습니다. 첫 번째 닫기 괄호를 포함하고 두 번째 NSLog 문을 계속 진행하며 마지막 닫기 괄호로 끝까지 이동하려면 괄호 안의. *를 검색 중입니다.) 문자를 제외하고 괄호 안에 모든 것을 포함하도록 지시

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

:

그래서 당신이 원하는 무엇을이 같은 것입니다. 그 정규식을 사용하여 두 개의 일치 항목을 얻습니다. (문자열 샘플에서 마지막을 생략했음을 유의하십시오.

관련 문제