問題描述:
校驗(yàn)如下字符串格式是否符合要求(括號(hào)成對(duì)出現(xiàn),且數(shù)量無限制)
(((a+b)*(c+d))+c)*(((a+b)*(c+d))+(d+e+c)+(w*i))
遇到這個(gè)問題,我第一想到的就是正則是不是有支持遞歸校驗(yàn)的功能,然后百度了好久,發(fā)現(xiàn)不是所有語言都支持遞歸校驗(yàn)的。最終沒能找到合適的方案,只能曲線救國了。
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
NSString *str1 = @"(((a+b)*(c+d))+c)*(((a+b)*(c+d))+(d+e+c)+(w*i))";
//NSString *str2 = @"(((a+b)*(c+d))+c)*(((a+b)*(c+d))+(d+e+c)+(w*i)))";
BOOL b = [self isValidString:str1];
NSLog(@"%d",b);
}
校驗(yàn)方法
- (BOOL)isValidString:(NSString *)str {
NSString *pattern = @"\\([^\\(^\\)]*?\\)";
NSString *pattern2 = @"\\(|\\)";
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern options:NSRegularExpressionCaseInsensitive error:NULL];
NSArray * rlts ;
while ((rlts = [regex matchesInString:str options:NSMatchingReportCompletion range:NSMakeRange(0, str.length)]).count) {
//找出最小單位的成對(duì)括號(hào),并用下劃線替換
str = [regex stringByReplacingMatchesInString:str options:NSMatchingReportCompletion range:NSMakeRange(0, str.length) withTemplate:@"_"];
}
/ /最后檢查一次,如果還存在左括號(hào)或者右括號(hào),說明出現(xiàn)了不成對(duì)的情況
regex = [NSRegularExpression regularExpressionWithPattern:pattern2 options:NSRegularExpressionCaseInsensitive error:NULL];
rlts = [regex matchesInString:str options:NSMatchingReportCompletion range:NSMakeRange(0, str.length)];
return rlts.count == 0;
}
當(dāng)輸入str1時(shí),結(jié)果為1,輸入str2,結(jié)果為0