首先说下正则表达式的定义:
正则表达式是对字符串操作的一种逻辑公式,正则表达式可以检测给定的字符串是否符合我们定义的逻辑,也可以从字符串中获取我们想要的特定部分,他可以迅速地用极简单的方式达到字符串的复杂控制或者说在编写处理字符串的程序时,经常会有查找符合某些复杂规则的字符串的需要,正则表达式就是用于描述这些规则的工具,换句话说,正则表达式就是记录文本规则的代码
那么正则表达式能做什么呢?1.给定的字符串是否符合正则表达式的过滤逻辑(表单验证);2.从字符串中获取我们的想要部分(对字符串进行处理)
再简单介绍下正则的写法:正则表达式,由一些普通字符和一些元字符组成,普通字符包括大小写字母和数字,而元字符则具有特殊的含义.那么特殊符号都有哪些呢?我们又具体怎么使用它们呢?
'^'和'$'他们的作用是分别指出一个字符的开始和结束.
举个例子:^one:表示所有以one开始的字符串("one cat,one123"),类似于OC中的hasPrefix方法;a dog$ 以 a dog 结尾;^apple$,那么这样的话只能是apple.
' * ' ' + ' ' ?'这三个符号表示一个或N个字符重复出现的次数
ab*表示一个字符串有一个a后面跟着零个或若干个b
ab+表示一个字符串有一个a后面跟着至少一个b或更多个b
ab?表示一个字符串有一个a后面跟着零个或一个b
a?b+$表示在字符串的末尾有零个或一个a跟着一个或几个b
{}表示一个重复的具体范围
ab{4}表示一个字符串一个a跟着4个b
ab{1,}表示一个字符串有一个a跟着至少一个b
ab{3,4}表示一个字符串有一个a跟着3到4个b
那么*用{0,}表示 +用{1,}表示 ?用{0,1}
注意:可以没有上限,但不能没有下限
|表示或操作
a|b表示一个字符串里有a或者b
(a|b)*c表示一串a,b混合的字符串后面跟一个c
[]表示在括号内的众多字符中,选择1个括号内的符合语法的字符作为结果
[a-d]表示a到d中的一个
.代表除了\r\n ....之外的任何单个字符
a.[a-z]表示一个字符串有一个a后面跟着一个任意字符
^.{5}$表示任意1个长度为五的字符串
在[]里面用^表示不希望出现的字符,
@[^a-zA-Z]4@表示两个@中不应该出现的字母
\d匹配一个数字字符,等价于[0-9]
\D匹配一个非数字字符,等价于[^0-9]
\w匹配包括下划线的任何单词字符,等价于[A-Za-z0-9_]
\W匹配任何非单词字符 等价于[^A-Za-z0-9]
\转义
接下来说下在项目里常用的正则表达式
验证身份证号 ^\\d{17}[0-9xX]$
只能输入数字和字母组成的字符串 ^[a-zA-Z0-9]+$
整数或小数 ^[0-9]+([.][0-9]+){0,1}$
只能是数字 ^[0-9]*$
只能输入n位数字 ^\\d{n}$
只能输入m~n位数字 ^\\d{m,n}$
只能输入非0的正整数 ^\\+?[1-9][0-9]*$
只能输入非0的负整数 ^\\-[1-9][0-9]*$
只能输入字母组成的字符串 ^[a-zA-Z]+$
判读是否输入了含有^%&',;=?$\\的特殊字符 .*[%&',;=?$\\^]+.*
只能输入汉字 ^[\u4e00-\u9fa5]{0,}$
验证URL ^https?://([\\w-]+\\.)+[\\w-]+(/[\\w-./?%&=]*)?$
验证一年12个月 ^(0?[1-9]|1[0-2])$
然后我们说下怎么用正则表达式去进行匹配进而去进行判断
//NSRegularExpression正则表达式类
// NSTextCheckingResult文本检查结果类
//要匹配的字符串
NSString *str = @"130120199411060039";
//正则语句
NSString *emailRegex = @"\\d{17}[0-9xX]";
//谓词NSPredicate 作用:1.验证正则表达式是否正确2.过滤数据和sql的where指定条件类似
NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES%@",emailRegex];
//判断
BOOL i = [emailTest evaluateWithObject:str];
if (i) {
NSLog(@"正确");
}else{
NSLog(@"错误");
}
NSArray *array = @[@"jim",@"cook",@"jobs",@"sdeven"];
//创建谓词对象,设置过滤条件
NSPredicate *pre = [NSPredicate predicateWithFormat:@"length>3"];
//对数组进行过滤得到一个新的数组
NSArray *arr = [array filteredArrayUsingPredicate:pre];
NSLog(@"%@",arr);
NSArray *array1 = @[@"2",@"3",@"4",@"5"];
NSPredicate *pre1 = [NSPredicate predicateWithFormat:@"integerValue>=%@",@3];
NSLog(@"%@",[array1 filteredArrayUsingPredicate:pre1]);
NSArray *arr2=@[@1,@6,@3];
NSPredicate *pre2 = [NSPredicate predicateWithFormat:@"SELF BETWEEN{1,3}"];
NSArray *arr3=[arr2 filteredArrayUsingPredicate:pre2];
NSLog(@"%@",arr3);
//在谓词里面使用BETWEEN在什么之间,如果不想用任何实例方法,想筛选成员本身应该怎么做呢,这时候就用self来代替; CONTAINS包含
//返回结果的类NSTextCheckingResult
//待检测的字符串
NSString *searchText = @"12345";
//定义错误
NSError *error = NULL ;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"^[0-9]+$" options:NSRegularExpressionCaseInsensitive error:&error];
//返回第一个匹配结果
NSTextCheckingResult *result = [regex firstMatchInString:searchText options:0 range:NSMakeRange(0, [searchText length])];
//若匹配成功
if (result) {
//输出匹配结果
NSLog(@"%@",[searchText substringWithRange:result.range]);
}
就现在来说,在我们的APP中,用到的最多的应该也是对手机号进行判断了,输入手机号收验证码或者将手机号最为账号都是很普遍的情况,我们来看下怎么对三大运营商的手机号进行判断.
//验证手机号
+ (BOOL)isValidateMobile:(NSString *)mobileNum{
/**
* 手机号码
* 移动: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,184,187,188
12 */
NSString * CM = @"^1(34[0-8]|(3[5-9]|5[017-9]|8[2478])\\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:mobileNum] == YES)
|| ([regextestcm evaluateWithObject:mobileNum] == YES)
|| ([regextestct evaluateWithObject:mobileNum] == YES)
|| ([regextestcu evaluateWithObject:mobileNum] == YES)){
return YES;
}
else
{
return NO;
}
}
网友评论