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

 

posted @ 2017-04-28 16:37  Frank9098  阅读(385)  评论(0)    收藏  举报