- (void)viewDidLoad {
[super viewDidLoad];
// @"168.0.0.1"
NSLog(@"--------This is right--------");
[self printResultOfRightIp:@"168.0.0.1"];
NSLog(@"--------following are wrong--------");
[self printResultOfRightIp:nil];
[self printResultOfRightIp:(NSString *)@1];
[self printResultOfRightIp:@"asdfjksal"];
[self printResultOfRightIp:@"168。0。0。1"];
[self printResultOfRightIp:@"168.001"];
[self printResultOfRightIp:@"168.0.0.1.1.1.1.1"];
[self printResultOfRightIp:@"我.999.0.1"];
[self printResultOfRightIp:@"1.999.0.1"];
[self printResultOfRightIp:@"0.999.0.1"];
[self printResultOfRightIp:@"9999999.999.0.1"];
[self printResultOfRightIp:@".1.1.1"];
[self printResultOfRightIp:@"^&^.&*&.(.*&*"];
[self printResultOfRightIp:@"a.b.c.d"];
[self printResultOfRightIp:@"1.b.c.d"];
[self printResultOfRightIp:@"1.😃.c.d"];
[self printResultOfRightIp:@"1.の.c.d"];
[self printResultOfRightIp:@"1.////.c.d"];
[self printResultOfRightIp:@"1.().c.d"];
[self printResultOfRightIp:@"001.002.03.14"];
}
- (void)printResultOfRightIp:(NSString *)ipAddress {
NSLog(@"%@ : %@", [self testIP:ipAddress] ? @"YES" : @"NO ", ipAddress);
}
- (BOOL)testIP:(NSString *)ipAddress {
if (nil == ipAddress)
RETURN_NO;
if (![ipAddress isKindOfClass:[NSString class]])
RETURN_NO;
{
NSArray *units = [ipAddress componentsSeparatedByString:@"."];
if (units.count != 4)
RETURN_NO;
for (int i = 0; i < units.count; i++) {
NSString *subIp = units[i];
NSString *pattern = @"[0-9]{0,3}";
NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",pattern];
if (![pred evaluateWithObject:subIp])
RETURN_NO;
int subIp_int = subIp.intValue;
if (subIp_int < 0 || subIp_int > 255)
RETURN_NO;
if (i == 0 && subIp_int < 1)
RETURN_NO;
if (![@(subIp_int).stringValue isEqualToString:subIp])
RETURN_NO;
}
}
return YES;
}
全部用正则有几个问题待解决:
-
无法确定每段的数值范围
-
无法排除0占位的情况