我有一个NSString,正在检查是否有NSLog,然后将其注释掉。
我正在使用NSRegularExpression,然后遍历结果。
代码:

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

    NSString  *regexStr =@"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如何处理正则表达式。我希望arrayOfAllMatches中有2个结果,但是我只能得到一个。有什么办法让Objective-C在第一次出现);时停止?

最佳答案

问题在于正则表达式。您正在括号内搜索。*,这将使其包括第一个右括号,继续执行第二个NSLog语句,并一直到最后一个右括号。

所以您想要做的是这样的:

NSString  *regexStr =@"NSLog\\([^\\)]*\\)[\\s]*\\;";

这告诉它在括号中包含除)字符外的所有内容。使用该正则表达式,我得到了两个匹配项。 (请注意,您在字符串示例中省略了final)。

10-08 13:54