010-正则表达式
一、简述
1.从概念上来说,正则表达式也是一门小巧而精炼的语言,它可以用来简化检索特定的字符串,替换特定字符等功能,有许多开发语言工具,都内嵌支持正则表达式。那么一个正则表达式,究竟是什么?其实它就是一个字符串,但这个字符串具有特定含义
2.在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码
二、基础语法
1.字面值
字面值就是没有任何转义,查找的对象就是其本身
例如:abc
表示:查找的结果就是返回要查找字符串中的a、b、c三个字母连在一起的字符串
查找结果:abc
2.特殊字符(元字符)
1)句号.
句号在正则表达式中表示匹配除换行符以外的任意字符,相当于通配字符
例如:a.b
表示:可以找到所有开头为a,结尾为b,中间为任意字符的字符串
查找结果:a2b、avb、a%b
2)字符类[]
一些字符被[]括起来,表示某一个被括号中的属性约束的字符
例如:a[123456]b
表示:可以找到所有开头为a,结尾为b,中间为1、2、3、4、5、6中的任意一个字符
查找结果:a1b、a2b、a3b、a4b、a5b、a6b
注意:
a.在字符类中字符的顺序和重复性都不重要。[123]和[223331]含义是一样的
b.句号在字符类中表示的就是其本身。[.]就是查找一个句号
3)区间符号-
如果我们需要查找一个数字,[0123456789]可以达到目的,但是过于繁琐,这时候就可以用区间符号
例如:[0-9]
表示:查找结果为数字
查找结果:0、1、2、3、4...
例如:[a-zA-Z]
表示:查找结果为字母(大写或小写)
查找结果:a、c、G、H...
例如:[2-41]
表示:查找结果为2、3、4中的任意一个或者是1,等价于[1-4]
查找结果:1、2、3、4
注意:
a.区间的范围必须有意义。[a-1]无任何意义
b.区间左右两边对应的是字符,不是数字。[2-41]不是表示2到41这个区间,而是表示2到4的区间或字符1,等价于[1-4]
4)取反符号^
取反符号在正则表达式中表示取反
例如:[^a]
表示:查找结果为除了a之外的任意字符
查找结果:b、3、D、A...
注意:
a.取反符号必须在括号或字符类属性中使用
b.取反符号是将后面的整体作为取反条件的。[^a-zA-Z]表示字母除外的任意字符
5)简化的字符类
某些符号具有字符类相同的含义
\d 等价于[0-9] 表示数字
\w 等价于[0-9A-Za-z_] 表示数字、字母、下划线
\s 等价于匹配空格、tab、换行等不可见符
与此相对的\D、\W、\S,则表示上述条件的取反情况
6)乘法集{}
乘法集最大用处就是简化正则表达式,用大括号表示
例如:a{2}
表示:展开其实就是aa
查找结果:aa
例如:[ab]{2}
表示:展开结果其实就是[ab][ab]
查找结果:aa、ab、ba、bb
注意:
乘法集是以前面整体为乘法条件的
7)乘法集中的区间,
乘法集和字符类相同,也可以用区间进行简化,但是符号不相同
例如:a{1,3}
表示:展开可以为a,也可以是aa,同时还可以是aaa
查找结果:a、aa、aaa
注意:
a."越长越好"属性:如a{2,4},如果我搜索myaaaa,它不会找到aa后就停止,而是会找到aaaa
b."全部获取"属性:如a{2.4},如果我搜索myaayouaaaa,它会找到aa和aaaa
c.乘法集支持开区间:如a{1,}是合法的,表示找到任意和a相连的字符串
8)判断符号?
这个符号的含义和{0,1}完全相同
例如:123?4
表示:等价于12[3]{0,1}4
查找结果:124、1234
9)通配符号*
这个符号与{0,}相同。如.*表示通配一切字符串
10)加号+
重复一次或更多次
11)或|
表示或的关系
例如:abc|edf
表示:找到abc或edf
12)小括号()
小括号在正则表达式中表示组合,可以将小括号理解为优先级
例如:(a|b|c)d
表示:找到ad、bd、cd
13)单词边界\b
\b表示单词的边界
例如:\b[a-z]{3}\b
表示:展开为\b[a-z][a-z][a-z]\b,匹配三个小写字母的单词
14)行边界^$
单单的一个^符号表示的是行的开头,$表示行的结束
注意:
[^]是非法的,[$]表示匹配的一个$符号
15)转义字符\
例如:\[\]
表示:查找[]这个字符串
例如:\\
表示:查找\这个字符串
三、代码实例
1 #import "LDFrank.h" 2 3 @implementation LDFrank 4 5 #pragma mark - 验证手机号码 6 // mobile 手机号字符串 7 // 验证规则:^((13[0-9])|(15[^4])|(18[0-9]))\\d{8}$ 8 // ^((13[0-9])|(15[^4])|(18[0-9])) 开头三位字符为13[0-9]或15[^4]或18[0-9] 9 // \\d{8}$ 结尾为任意的8个数字字符 10 + (BOOL)validateMobile:(NSString *)mobile 11 { 12 //手机号以13, 15,18开头,八个 \d 数字字符 13 NSString *phoneRegex = @"^((13[0-9])|(15[^4])|(18[0-9]))\\d{8}$"; 14 NSPredicate *phoneTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",phoneRegex]; 15 return [phoneTest evaluateWithObject:mobile]; 16 } 17 18 #pragma mark - 验证车牌号 19 // carNo 车牌号 20 // 验证规则:^[\u4e00-\u9fa5]{1}[a-zA-Z]{1}[a-zA-Z_0-9]{4}[a-zA-Z_0-9_\u4e00-\u9fa5]$ 21 // ^[\u4e00-\u9fa5]{1} 开头为1位省会简称中文字符 22 // [a-zA-Z]{1} 紧接着就是1位字母(大写或小写)字符 23 // [a-zA-Z_0-9]{4} 紧接着4位数字或字母(大写或小写)或下划线字符 24 // [a-zA-Z_0-9_\u4e00-\u9fa5]$ 结尾是1位数字或字母(大写或小写)或下划线或中文字符 25 + (BOOL)validateCarNo:(NSString *)carNo 26 { 27 NSString *carRegex = @"^[\u4e00-\u9fa5]{1}[a-zA-Z]{1}[a-zA-Z_0-9]{4}[a-zA-Z_0-9_\u4e00-\u9fa5]$"; 28 NSPredicate *carTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",carRegex]; 29 NSLog(@"carTest is %@",carTest); 30 return [carTest evaluateWithObject:carNo]; 31 } 32 33 #pragma mark - 验证车型 34 // carType 车型字符串 35 // 验证规则:^[\u4E00-\u9FFF]+$ 36 // ^[\u4E00-\u9FFF]+$ 任意个数的中文 37 + (BOOL)validateCarType:(NSString *)carType 38 { 39 NSString *carTypeRegex = @"^[\u4E00-\u9FFF]+$"; 40 NSPredicate *carTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",carTypeRegex]; 41 return [carTest evaluateWithObject:carType]; 42 } 43 44 #pragma mark - 验证邮箱 45 // email 邮箱字符串 46 // 验证规则:[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4} 47 // [A-Z0-9a-z._%+-]+ 字母(大写或小写)、数字、句号、下划线、百分号、加号、减号随意重复 48 // @ 紧跟着@符号 49 // [A-Za-z0-9.-]+ 字母(大写或小写)、数字随意重复 50 // \\. 紧跟着是一个句号 51 // [A-Za-z]{2,4} 字母(大写或小写)重复2到4遍 52 + (BOOL)validateEmail:(NSString *)email 53 { 54 NSString *emailRegex = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"; 55 NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex]; 56 return [emailTest evaluateWithObject:email]; 57 } 58 59 @end

浙公网安备 33010602011771号