iOS正则的基本使用

2018-01-10  本文已影响27人  Sky109

正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。这种公式语法优美简洁,经常被我们开发用来匹配字符串,封装成各种判断方法;

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]);
}
上一篇下一篇

猜你喜欢

热点阅读