我有一个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)。