嗯,之前1、2个星期,先是去搞了搞别人搞得高大上,自己搞的幼稚的动画效果(),接着看了看Swift的官方文档《The Swift Programming Lauguage》, 刚刚看完一遍,发现2.0又出来了,想起好久没来更新过blog了,决定先整理整理现在项目中用到的一些东西。
因为项目中有很多输入的Textfield,很多输入的限制,一开始只是限制数字输入,限制位数,逐渐发展到后面限制输入例如8位的YYYYMMDD的日期格式,24小时格式,现在为止发现正则表达式来实现这些最完美了,这个世界真奇妙。
下面直接进入主题:(有些是自己写出来的,有些是参考了度娘的,如果有更简单的表达式或者出现错误了,请指出,以后找到有用的正则继续收录到这里)
限制内容 | 正则表达式 | 备注 |
---|---|---|
纯数字 | ^\d*$ | |
限制字数的纯数字 | ^\d{0,a}$ | a为自定义数字个数 |
数字加特定字母 | ^[0-9Xx]{0,%ld}$ | 这里主要用于身份证最后一位可以为X的情况 |
只包含数字0-9和小数点 | ^[0-9]\d{0,a}([\.]\d{0,b})?$ | a:小数点前数字长度, b:小数点后数字长度 |
正负数 | ^[-]?[0-9]{0,a}$ | a:数字长度 |
24小时格式 | ((0[0-9])l(1[0-9])l(2[0-4])) | l需要替成“或”,下面出现一样替换 |
身份证内容校验 | 参考下面代码块regex | 太长了,还是单独列出来比较容易看 |
匹配中文字符 | ^\u4e00-\u9fa5 | |
匹配双字节字符 | ^\x00-\xff | 计算字符串的长度 |
匹配全角字符 | ^\uFF00-\uFFFF | |
匹配空白行 | ^\n\s*\r | 可以用来删除空白行 |
匹配HTML标记 | <(\S*?)[^>]>.?l<.*? /> | |
匹配首尾空白字符 | ^\s*l\s*$ | 可以用来删除行首行尾的空白字符 |
匹配Email地址 | [A-Z0-9a-z._%+-]+@[A-Z0-9a-z.-]+\.[A-Za-Z]{2,4} | |
匹配网址URL | [a-zA-z]+://[^\s]* | |
字母开头,允许5-16字节,允许字母数字下划线 | ^[a-zA-Z][a-zA-Z0-9_]{4,15}$ | |
匹配国内电话号码 | \d{3}-\d{8}l\d{4}-\d{7} | 匹配形式如 0511-4405222 或 021-87888822 |
匹配腾讯QQ号 | [1-9][0-9]{4,} | 腾讯QQ号从10000开始 |
匹配中国邮政编码 | [1-9]\d{5}(?!\d) | 中国邮政编码为6位数字 |
匹配ip地址 | \d+.\d+.\d+.\d+ | |
区号+座机号码+分机号码 | ^(0[0-9]{2,3}/-)?([2-9][0-9]{6,7})+(/-[0-9]{1,4})?$ | |
手机(中国移动手机号码) | ^((/(/d{3}/))L(/d{3}/-))?13[456789]/d{8}L15[89]/d{8} | |
所有手机号码 | ^((/(/d{3}/))L(/d{3}/-))?13[0-9]/d{8}L15[89]/d{8} | |
验证手机号(简单) | 1[3l5l7l8][0-9]{9} |
身份证校验正则表达式如下:
//验证身份证
//必须满足以下规则
//1. 长度必须是18位,前17位必须是数字,第十八位可以是数字或X
//2. 前两位必须是以下情形中的一种:11,12,13,14,15,21,22,23,31,32,33,34,35,36,37,41,42,43,44,45,46,50,51,52,53,54,61,62,63,64,65,71,81,82,91
//3. 第7到第14位出生年月日。第7到第10位为出生年份;11到12位表示月份,范围为01-12;13到14位为合法的日期
//4. 第17位表示性别,双数表示女,单数表示男
//5. 第18位为前17位的校验位
//算法如下:
//(1)校验和 = (n1 + n11) * 7 + (n2 + n12) * 9 + (n3 + n13) * 10 + (n4 + n14) * 5 + (n5 + n15) * 8 + (n6 + n16) * 4 + (n7 + n17) * 2 + n8 + n9 * 6 + n10 * 3,其中n数值,表示第几位的数字
//(2)余数 = 校验和 % 11
//(3)如果余数为0,校验位应为1,余数为1到10校验位应为字符串“0X98765432”(不包括分号)的第余数位的值(比如余数等于3,校验位应为9)
//6. 出生年份的前两位必须是19或20
+ (BOOL)verifyIDCardBirthday:(NSString *)value{
//出生日期
value = [value stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
if ([value length] != 18) {
return NO;
}
NSString *mmdd = @"(((0[13578]|1[02])(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)(0[1-9]|[12][0-9]|30))|(02(0[1-9]|[1][0-9]|2[0-8])))";
NSString *leapMmdd = @"0229";
NSString *year = @"(19|20)[0-9]{2}";
NSString *leapYear = @"(19|20)(0[48]|[2468][048]|[13579][26])";
NSString *yearMmdd = [NSString stringWithFormat:@"%@%@", year, mmdd];
NSString *leapyearMmdd = [NSString stringWithFormat:@"%@%@", leapYear, leapMmdd];
NSString *yyyyMmdd = [NSString stringWithFormat:@"((%@)|(%@)|(%@))", yearMmdd, leapyearMmdd, @"20000229"];
NSString *area = @"(1[1-5]|2[1-3]|3[1-7]|4[1-6]|5[0-4]|6[1-5]|82|[7-9]1)[0-9]{4}";
NSString *regex = [NSString stringWithFormat:@"%@%@%@", area, yyyyMmdd , @"[0-9]{3}[0-9Xx]"];
NSPredicate *regexTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
if (![regexTest evaluateWithObject:value]) {
return NO;
}
return YES;
}
+ (BOOL)verifyIDCardNumber:(NSString *)value
{
value = [value stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
if ([value length] == 18) {
//第18位校验
int summary = ([value substringWithRange:NSMakeRange(0,1)].intValue + [value substringWithRange:NSMakeRange(10,1)].intValue) *7
+ ([value substringWithRange:NSMakeRange(1,1)].intValue + [value substringWithRange:NSMakeRange(11,1)].intValue) *9
+ ([value substringWithRange:NSMakeRange(2,1)].intValue + [value substringWithRange:NSMakeRange(12,1)].intValue) *10
+ ([value substringWithRange:NSMakeRange(3,1)].intValue + [value substringWithRange:NSMakeRange(13,1)].intValue) *5
+ ([value substringWithRange:NSMakeRange(4,1)].intValue + [value substringWithRange:NSMakeRange(14,1)].intValue) *8
+ ([value substringWithRange:NSMakeRange(5,1)].intValue + [value substringWithRange:NSMakeRange(15,1)].intValue) *4
+ ([value substringWithRange:NSMakeRange(6,1)].intValue + [value substringWithRange:NSMakeRange(16,1)].intValue) *2
+ [value substringWithRange:NSMakeRange(7,1)].intValue *1 + [value substringWithRange:NSMakeRange(8,1)].intValue *6
+ [value substringWithRange:NSMakeRange(9,1)].intValue *3;
NSInteger remainder = summary % 11;
NSString *checkBit = @"";
NSString *checkString = @"10X98765432";
checkBit = [checkString substringWithRange:NSMakeRange(remainder,1)];// 判断校验位
return [checkBit isEqualToString:[[value substringWithRange:NSMakeRange(17,1)] uppercaseString]];
}
return NO;
}
详细的验证手机号方法
//正则判断手机号码格式
+ (BOOL)validatePhone:(NSString *)phone
{
/**
* 手机号码
* 移动:134[0-8],135,136,137,138,139,150,151,157,158,159,182,187,188
* 联通:130,131,132,152,155,156,185,186
* 电信:133,1349,153,180,189
*/
NSString * MOBILE = @"^1(3[0-9]|5[0-35-9]|8[025-9])\\d{8}$";
/**
10 * 中国移动:China Mobile
11 * 134[0-8],135,136,137,138,139,150,151,157,158,159,182,187,188
12 */
NSString * CM = @"^1(34[0-8]|(3[5-9]|5[017-9]|8[278])\\d)\\d{7}$";
/**
15 * 中国联通:China Unicom
16 * 130,131,132,152,155,156,185,186
17 */
NSString * CU = @"^1(3[0-2]|5[256]|8[56])\\d{8}$";
/**
20 * 中国电信:China Telecom
21 * 133,1349,153,180,189
22 */
NSString * CT = @"^1((33|53|8[09])[0-9]|349)\\d{7}$";
/**
25 * 大陆地区固话及小灵通
26 * 区号:010,020,021,022,023,024,025,027,028,029
27 * 号码:七位或八位
28 */
// NSString * PHS = @"^0(10|2[0-5789]|\\d{3})\\d{7,8}$";
NSPredicate *regextestmobile = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", MOBILE];
NSPredicate *regextestcm = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CM];
NSPredicate *regextestcu = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CU];
NSPredicate *regextestct = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CT];
if (([regextestmobile evaluateWithObject:phone] == YES)
|| ([regextestcm evaluateWithObject:phone] == YES)
|| ([regextestct evaluateWithObject:phone] == YES)
|| ([regextestcu evaluateWithObject:phone] == YES))
{
if([regextestcm evaluateWithObject:phone] == YES) {
NSLog(@"China Mobile");
} else if([regextestct evaluateWithObject:phone] == YES) {
NSLog(@"China Telecom");
} else if ([regextestcu evaluateWithObject:phone] == YES) {
NSLog(@"China Unicom");
} else {
NSLog(@"Unknow");
}
return YES;
}
else
{
return NO;
}
}