正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。这种公式语法优美简洁,经常被我们开发用来匹配字符串,封装成各种判断方法;
image正则表达式
先举个简单例子,比如输入框输入一个6~12位的密码,很多人会这样写:
if(textField.text.length >= 6 && textField.text.leng <= 12);
这样写没有错,也是绝大多部分同学写的方法,但是你用正则表达式判断则是:
^.{6,12}$
是不是非常简洁?再比如纯数字验证:
^[0-9]+$
可能初学者并不懂上面的符号代表着什么意思,现在我为大家解释下什么意思:
1、^和$属于特殊符号,他们的作用是分别指出一个字符串的开始和结束
例:“^one”:表示所有以”one”开始的字符串(”one mouse”,”one123456″,·····);
相当于iOS的方法:- (BOOL)hasPrefix:(NSString *)aString;
“a dog$”:表示所以以”a dog”结尾的字符串(”this is a dog”,·····);
类似于:- (BOOL)hasSuffix:(NSString *)aString;
2、{n}表示匹配字符重复n次;{n,}匹配重复n次或更多次;{n,m}匹配重复n到m之间次数。所以{6,12}则表示6~12位字符
3、.符号表示任一字符(除换行符之外),所以{6,12}跟在.符号后面则表示6至12位长度的字符串,所以^.{6,12}$能够匹配密码;
4、[0-9]:表示一个字符串包含'0'到'9'中的一个;
5、+表示后面跟着至少一个前一位的字符;所以^[0-9]+$可以匹配纯数字;
解释到应该上面两个正则表达式感觉很简单,是不是瞬间也觉得该语法也特别精悍,不过整个语法不可能这么简单,比如下面的表达式:
^0\\d{2}\-?\\d{8}$
我们慢慢分析一下:
1、.符号上面说了表示任一字符(除换行符之外),但是.符号是不限制字符的,匹配度太高,所以该语法又提供了\d表示任意的单个数字,\w表示26个字母;\s表示空格Tab换行;
2、{n}表示匹配字符重复n次
3、?表示前一个字符为0或者1个;
综上所述,上面的表达式表示以0开头接着两位数字,再接着一个'-'符号或者没有'-'符号,后面再接着8位数字,所以大概写一下是不是也很熟悉?010-13236782或者01013236782,没错,这就是中国固定电话的匹配方式,因为大部分的固定电话都是0区号-八位数字的格式!
不过有人会问,表达式是\d而不是\d,这如何解释?
**注意:这是因为\本身是转义符号,为了保证表达式能正常匹配,我们要给\进行一次转义,所以就变成了\ **
//需要转义的字符* + ? $ ^ . | \ ( ) { } [ ]
下面就列举下正则表达式的基本语法:
’^'和’$'表示一个字符串的开始和结束
‘’,’+'和’?'这三个符号,表示一个或N个字符重复出现的次数。它们分别表示“没有或更多”([0,+∞]取整),“一次或更多”([1,+∞]取整),“没有或一次”([0,1]取整)。下面是几个例子:
“ab”
:表示一个字符串有一个a后面跟着零个或若干个b(”a”, “ab”, “abbb”,……);
“ab+”
:表示一个字符串有一个a后面跟着至少一个b或者更多( ”ab”, “abbb”,……);
“ab?”
:表示一个字符串有一个a后面跟着零个或者一个b( ”a”, “ab”);
“a?b+$”
:表示在字符串的末尾有零个或一个a跟着一个或几个b( ”b”, “ab”,”bb”,”abb”,……)。
可以用大括号括起来({}),表示一个重复的具体范围。例如
“ab{4}”
:表示一个字符串有一个a跟着4个b(”abbbb”);
“ab{1,}”
:表示一个字符串有一个a跟着至少1个b(”ab”,”abb”,”abbb”,……);
“ab{3,4}”
:表示一个字符串有一个a跟着3到4个b(”abbb”,”abbbb”)
。那么,“
”可以用{0,}表示,“+”可以用{1,}表示,“?”可以用{0,1}表示
注意:可以没有下限,但是不能没有上限!例如“ab{,5}”是错误的写法
“ | ”表示“或”操作:
“a|b”
:表示一个字符串里有”a”或者”b”;
“(a|bcd)ef”
:表示”aef”或”bcdef”;
“(a|b)*c”
:表示一串”a”"b”混合的字符串后面跟一个”c”;
方括号”[ ]“表示在括号内的众多字符中,选择1-N个括号内的符合语法的字符作为结果,例如
“[ab]“
:表示一个字符串有一个”a”或”b”(相当于”a|b”);
“[a-d]“
:表示一个字符串包含小写的’a'到’d'中的一个(相当于”a|b|c|d”或者”[abcd]“);
“^[a-zA-Z]“
:表示一个以字母开头的字符串;
“[0-9]a”
:表示a前有一位的数字;
“[a-zA-Z0-9]$”
:表示一个字符串以一个字母或数字结束。
“.”匹配除“\r\n”之外的任何单个字符:
“a.[a-z]“
:表示一个字符串有一个”a”后面跟着一个任意字符和一个小写字母;
“^.{5}$”
:表示任意1个长度为5的字符串;
“\num”
其中num是一个正整数。表示”\num”之前的字符出现相同的个数,例如
“(.)\1″
:表示两个连续的相同字符。
“10{1,2}”
: 表示数字1后面跟着1或者2个0(“10″,”100″)
。
” 0{3,} ”
表示数字为至少3个连续的0 (“000”,“0000”,······)
。
在方括号里用’'表示不希望出现的字符,’'应在方括号里的第一位。
“@[^a-zA-Z]4@”
表示两个”@”中不应该出现字母)。
常用的还有:
“ \d ”
匹配一个数字字符。等价于[0-9]
。
“ \D”
匹配一个非数字字符。等价于[^0-9]
。
“ \w ”
匹配包括下划线的任何单词字符。等价于“[A-Za-z0-9_]”
。
“ \W ”
匹配任何非单词字符。等价于“[^A-Za-z0-9_]”
。
这里只是列举了常用语法,想要知道更多,自行百度!
理解了基本语法,现在让我们自己动手来实践一下,比如怎么写匹配电子邮箱的正则表达式:
1、首先先看看电子邮箱格式是怎样的?比如以下邮箱:test@hotmail.comtest@sina.vip.comte-st@qq.com.cnte_st@sina.vip.comt.e_st@si-na.vip.com2
、开始必须是一个或者多个单词字符中间或穿插特殊字符-._,加上@,然后又是一个或者多个单词字符或者是-.。然后是点“.”和单词字符和-.的组合,可以有一个或者多个组合,邮箱域至少有一个“.”和两个单词,再严格点那么最后的顶级域至少要2个字母不能是数字,特殊字符不会出现在首尾两端!3、所以综合上诉得出:^([a-z0-9A-Z]+[-|_|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$
当然,正则表达式不止一种写法,有非常多的写法,然后根据自己项目的规则也写法不一样,有些判断的稍微宽松点,这都是灵活性的,不要死板说别人的就是错的,比如[参考]杨元庆@联想.中国这样都是可以的呢,规则一直在变!
在iOS里面运用正则表达式判断需要用到谓词NSPredicate,代码如下:
+ (BOOL)isValidateEmail:(NSString*)email {
NSString*emailRegex =@"^([a-z0-9A-Z]+[-|_|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$";
NSPredicate*emailTest = [NSPredicatepredicateWithFormat:@"SELF MATCHES %@", emailRegex];return[emailTest evaluateWithObject:email];
}
所有用正则表达式判断的都是上诉方法,只是改变表达式就可以,下面列举了些常用的正则表达式:
1、手机号:^[1][34578]\\d{9}$
2、身份证号:^(\\d{14}|\\d{17})(\\d|[xX])$
电子邮箱:^([a-z0-9A-Z]+[-|_|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$
3、车牌号:^[\u4e00-\u9fff]{1}[a-zA-Z]{1}[-][a-zA-Z_0-9]{4}[a-zA-Z_0-9_\u4e00-\u9fff]$
//其中\u4e00-\u9fa5
表示unicode编码中汉字已编码部分,\u9fa5-\u9fff
是保留部分,将来可能会添加;湘K-DE829 香港车牌号码:粤Z-J499港
4、mac地址:^([A-Fa-f\\d]{2}:){5}[A-Fa-f\\d]{2}$
5、url:^((http)|(https))+:[^\\s]+\\.[^\\s]*$
6、邮政编码:^[1-9]\\d{5}(?!\d)$
7、汉字:^[\u4e00-\u9fa5]+$
8、是否含有^%&’,;=?$\”等字符:^[^%&’,;=?$\x22]+$
9、不允许特殊符号(如:用户名6-20位):^[a-zA-Z0-9]{6,20}$
10、密码强度(一个或以上的大写字母以及小写字母):^.*[A-Z]+.*[a-z]+.*$|^.*[a-z]+.*[A-Z]+.*$
OC中正则表达式的使用步骤:
编写正则表达式的样式:
NSString *string= @"5347858h7";
初始化正则表达式:
NSRegularExpression*regex = [[NSRegularExpressionalloc] initWithPattern:pattern options:0 error:nil];
匹配字符串并返回结果:
NSArray *results = [regex matchesInString:stringoptions:0range:NSMakeRange(0,string.length)];
输出结果:
for(NSTextCheckingResult*resultinresults) {
NSLog(@"范围:%@ 结果:%@",NSStringFromRange(result.range), [string substringWithRange:result.range]);
}
网友评论