iOS正则的基本使用

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

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]);
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341