正则表达式集锦(三)
来源:互联网 发布:中学生编程竞赛 编辑:程序博客网 时间:2024/03/29 09:19
什么是正则?
我理解的正则表达式(Regular Expression)就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
常用正则表达式
其实不管iOS还是Android还是其他语言,正则的基本语法是相同的,只不过不同语言,某些高级特性并不是都支持,但万变不离其中。下面贴的是OC的常用正则表达式,包含手机号,密码,身份证号,银行卡号以及邮箱,供有需要的同学参考。
1.SQRegularExpression.h
#import <Foundation/Foundation.h>@interface SQRegularExpression : NSObject/** * 手机号校验 */+ (BOOL) isMobile:(NSString *)mobileNumbel;/** * 密码校验 */+ (BOOL) isPassword:(NSString *)password;/** * 邮箱校验 */+ (BOOL) isEmail:(NSString *)email;/** * 身份证号校验 */+ (BOOL) isIdentityCard: (NSString *)identityCard;/** * 银行卡号校验 */+ (BOOL) isBankCardluhmCheck:(NSString *)bankNumber;@end
2.SQRegularExpression.m
#import "SQRegularExpression.h"@implementation SQRegularExpression/** * 手机号码验证 * * @param mobileNumbel 传入的手机号码 * * @return 格式正确返回true 错误 返回fals */+ (BOOL) isMobile:(NSString *)mobileNumbel{ /** * 手机号码 * 移动: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,181(增加) * 新增:14_,17_ */ NSString * MOBIL = @"^1(3[0-9]|4[0-9]|5[0-35-9]|7[0-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[2378])\\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,181(增加) 22 */ NSString * CT = @"^1((33|53|8[019])[0-9]|349)\\d{7}$"; NSPredicate *regextestmobile = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", MOBIL]; NSPredicate *regextestcm = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CM]; NSPredicate *regextestcu = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CU]; NSPredicate *regextestct = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CT]; if (([regextestmobile evaluateWithObject:mobileNumbel] || [regextestcm evaluateWithObject:mobileNumbel] || [regextestct evaluateWithObject:mobileNumbel] || [regextestcu evaluateWithObject:mobileNumbel])) { return YES; } return NO;}/** * 密码验证 * * @param password 传入的密码 6-16位 大小写数字 * * @return 格式正确返回true 错误 返回fals */+ (BOOL) isPassword:(NSString *)password{ NSString *pwd = @"^[a-zA-Z0-9]{6,16}$"; NSPredicate *regextestPwd = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",pwd]; if ([regextestPwd evaluateWithObject:password]) { return YES; } return NO;}/** * 邮箱验证 * * @param email 传入的邮箱 * * @return 格式正确返回true 错误 返回fals */+ (BOOL) isEmail:(NSString *)email{ NSString *emailRegex = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"; NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex]; if ([emailTest evaluateWithObject:email]) { return YES; } return NO;}/** * 身份证号验证 * * @param identityCard 传入的身份证号 * * @return 格式正确返回true 错误 返回fals */+ (BOOL) isIdentityCard: (NSString *)identityCard{ NSString *idnum = @"^(\\d{14}|\\d{17})(\\d|[xX])$"; NSPredicate *identityCardPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",idnum]; return [identityCardPredicate evaluateWithObject:identityCard];}/** 银行卡号有效性问题Luhn算法 * 现行 16 位银联卡现行卡号开头 6 位是 622126~622925 之间的,7 到 15 位是银行自定义的, * 可能是发卡分行,发卡网点,发卡序号,第 16 位是校验码。 * 16 位卡号校验位采用 Luhm 校验方法计算: * 1,将未带校验位的 15 位卡号从右依次编号 1 到 15,位于奇数位号上的数字乘以 2 * 2,将奇位乘积的个十位全部相加,再加上所有偶数位上的数字 * 3,将加法和加上校验位能被 10 整除。 */+ (BOOL) isBankCardluhmCheck:(NSString *)bankNumber{ NSString * lastNum = [[bankNumber substringFromIndex:(bankNumber.length-1)] copy];//取出最后一位 NSString * forwardNum = [[bankNumber substringToIndex:(bankNumber.length -1)] copy];//前15或18位 NSMutableArray * forwardArr = [[NSMutableArray alloc] initWithCapacity:0]; for (int i=0; i<forwardNum.length; i++) { NSString * subStr = [forwardNum substringWithRange:NSMakeRange(i, 1)]; [forwardArr addObject:subStr]; } NSMutableArray * forwardDescArr = [[NSMutableArray alloc] initWithCapacity:0]; for (int i = (int)(forwardArr.count-1); i> -1; i--) {//前15位或者前18位倒序存进数组 [forwardDescArr addObject:forwardArr[i]]; } NSMutableArray * arrOddNum = [[NSMutableArray alloc] initWithCapacity:0];//奇数位*2的积 < 9 NSMutableArray * arrOddNum2 = [[NSMutableArray alloc] initWithCapacity:0];//奇数位*2的积 > 9 NSMutableArray * arrEvenNum = [[NSMutableArray alloc] initWithCapacity:0];//偶数位数组 for (int i=0; i< forwardDescArr.count; i++) { NSInteger num = [forwardDescArr[i] intValue]; if (i%2) {//偶数位 [arrEvenNum addObject:[NSNumber numberWithInteger:num]]; }else{//奇数位 if (num * 2 < 9) { [arrOddNum addObject:[NSNumber numberWithInteger:num * 2]]; }else{ NSInteger decadeNum = (num * 2) / 10; NSInteger unitNum = (num * 2) % 10; [arrOddNum2 addObject:[NSNumber numberWithInteger:unitNum]]; [arrOddNum2 addObject:[NSNumber numberWithInteger:decadeNum]]; } } } __block NSInteger sumOddNumTotal = 0; [arrOddNum enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { sumOddNumTotal += [obj integerValue]; }]; __block NSInteger sumOddNum2Total = 0; [arrOddNum2 enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { sumOddNum2Total += [obj integerValue]; }]; __block NSInteger sumEvenNumTotal = 0 ; [arrEvenNum enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { sumEvenNumTotal += [obj integerValue]; }]; NSInteger lastNumber = [lastNum integerValue]; NSInteger luhmTotal = lastNumber + sumEvenNumTotal + sumOddNum2Total + sumOddNumTotal; return (luhmTotal%10 ==0)?YES:NO;}@end
另附常用正则字符
^ :匹配字符串的开始位置
$ :匹配字符串的结束位置
- :匹配前面的子表达式任意次。例如,sq能匹配“s”,也能匹配“sq”以及“sqq”。
\d:匹配一个数字字符。等价于[0-9]。
{n} :n是一个非负整数。匹配确定的n次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的两个o。
{n,}:n是一个非负整数。至少匹配n次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o。“o{1,}”等价于“o+”。“o{0,}”则等价于“o*”。
{n,m} :m和n均为非负整数,其中n<=m。最少匹配n次且最多匹配m次。例如,“o{1,3}”将匹配“fooooood”中的前三个o。“o{0,1}”等价于“o?”。请注意在逗号和两个数之间不能有空格。
+:匹配前面的子表达式一次或多次(大于等于1次)。例如,“sq+”能匹配“sq”以及“sqq”,但不能匹配“s”。+等价于{1,}。
? :匹配前面的子表达式零次或一次。例如,“do(es)?”可以匹配“do”或“does”中的“do”。?等价于{0,1}。
注意:只有连字符在字符组内部时,并且出现在两个字符之间时,才能表示字符的范围; 如果出字符组的开头,则只能表示连字符本身.
\s :匹配任意的空白符
\w:匹配字母或数字或下划线或汉字
- 正则表达式集锦(三)
- 常用正则表达式集锦
- 常用正则表达式集锦
- 常用正则表达式集锦
- 正则表达式网址集锦
- 常用正则表达式集锦
- 常用正则表达式集锦
- 正则表达式集锦
- 正则表达式集锦
- 常用正则表达式集锦
- 常用正则表达式集锦
- 经典正则表达式集锦
- 常用正则表达式集锦
- C#正则表达式集锦
- 常用正则表达式集锦
- 正则表达式集锦
- 常用正则表达式集锦
- c#正则表达式集锦
- 老毕整理的去年比较难的面试题目,供参考
- HDU 1000 A + B Problem 1001 Sum Problem
- HDU5816(2016多校第七场)——Hearthstone(暴力枚举,状态压缩)
- JSP中文乱码问题
- Valid Palindrome
- 正则表达式集锦(三)
- Factor Combinations
- 简化条件表达式(一)
- SublimeText2介绍
- 工厂模式
- 使用Oracle分析函数随机抽取N条记录
- IoC模式
- 我和我四次版本的上传模块
- 用ABBYY怎么提高工作效率