正则表达式

首先说下正则表达式的定义:

正则表达式是对字符串操作的一种逻辑公式,正则表达式可以检测给定的字符串是否符合我们定义的逻辑,也可以从字符串中获取我们想要的特定部分,他可以迅速地用极简单的方式达到字符串的复杂控制或者说在编写处理字符串的程序时,经常会有查找符合某些复杂规则的字符串的需要,正则表达式就是用于描述这些规则的工具,换句话说,正则表达式就是记录文本规则的代码

那么正则表达式能做什么呢?1.给定的字符串是否符合正则表达式的过滤逻辑(表单验证);2.从字符串中获取我们的想要部分(对字符串进行处理)
再简单介绍下正则的写法:正则表达式,由一些普通字符和一些元字符组成,普通字符包括大小写字母和数字,而元字符则具有特殊的含义.那么特殊符号都有哪些呢?我们又具体怎么使用它们呢?
'^'和'$'他们的作用是分别指出一个字符的开始和结束.
举个例子:^one:表示所有以one开始的字符串("one cat,one123"),类似于OC中的hasPrefix方法;a dog$ 以 a dog 结尾;^apple$,那么这样的话只能是apple.
' * '  ' + '   ' ?'这三个符号表示一个或N个字符重复出现的次数
ab*表示一个字符串有一个a后面跟着零个或若干个b
ab+表示一个字符串有一个a后面跟着至少一个b或更多个b
ab?表示一个字符串有一个a后面跟着零个或一个b
a?b+$表示在字符串的末尾有零个或一个a跟着一个或几个b
{}表示一个重复的具体范围
ab{4}表示一个字符串一个a跟着4个b
ab{1,}表示一个字符串有一个a跟着至少一个b
ab{3,4}表示一个字符串有一个a跟着3到4个b
那么*用{0,}表示 +用{1,}表示 ?用{0,1}
注意:可以没有上限,但不能没有下限
|表示或操作 
a|b表示一个字符串里有a或者b
(a|b)*c表示一串a,b混合的字符串后面跟一个c
[]表示在括号内的众多字符中,选择1个括号内的符合语法的字符作为结果
[a-d]表示a到d中的一个
.代表除了\r\n ....之外的任何单个字符
     a.[a-z]表示一个字符串有一个a后面跟着一个任意字符
     ^.{5}$表示任意1个长度为五的字符串
     在[]里面用^表示不希望出现的字符,
     @[^a-zA-Z]4@表示两个@中不应该出现的字母
     \d匹配一个数字字符,等价于[0-9]
     \D匹配一个非数字字符,等价于[^0-9]
     \w匹配包括下划线的任何单词字符,等价于[A-Za-z0-9_]
     \W匹配任何非单词字符 等价于[^A-Za-z0-9]
     \转义

接下来说下在项目里常用的正则表达式

验证身份证号                  ^\\d{17}[0-9xX]$
     只能输入数字和字母组成的字符串   ^[a-zA-Z0-9]+$
     整数或小数                    ^[0-9]+([.][0-9]+){0,1}$
     只能是数字                    ^[0-9]*$
     只能输入n位数字               ^\\d{n}$
     只能输入m~n位数字             ^\\d{m,n}$
     只能输入非0的正整数            ^\\+?[1-9][0-9]*$
     只能输入非0的负整数            ^\\-[1-9][0-9]*$
     只能输入字母组成的字符串        ^[a-zA-Z]+$
     判读是否输入了含有^%&',;=?$\\的特殊字符     .*[%&',;=?$\\^]+.*
     只能输入汉字                  ^[\u4e00-\u9fa5]{0,}$
     验证URL      ^https?://([\\w-]+\\.)+[\\w-]+(/[\\w-./?%&=]*)?$
     验证一年12个月                ^(0?[1-9]|1[0-2])$

然后我们说下怎么用正则表达式去进行匹配进而去进行判断

//NSRegularExpression正则表达式类
   // NSTextCheckingResult文本检查结果类
    
    //要匹配的字符串
    NSString *str = @"130120199411060039";
    //正则语句
    NSString *emailRegex = @"\\d{17}[0-9xX]";
    //谓词NSPredicate 作用:1.验证正则表达式是否正确2.过滤数据和sql的where指定条件类似
    NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES%@",emailRegex];
    //判断
    BOOL i = [emailTest evaluateWithObject:str];
    if (i) {
        NSLog(@"正确");
    }else{
        NSLog(@"错误");
    }
NSArray *array = @[@"jim",@"cook",@"jobs",@"sdeven"];
    //创建谓词对象,设置过滤条件
    NSPredicate *pre = [NSPredicate predicateWithFormat:@"length>3"];
    //对数组进行过滤得到一个新的数组
    NSArray *arr = [array filteredArrayUsingPredicate:pre];
    NSLog(@"%@",arr);
    
    NSArray *array1 = @[@"2",@"3",@"4",@"5"];
    NSPredicate *pre1 = [NSPredicate predicateWithFormat:@"integerValue>=%@",@3];
    NSLog(@"%@",[array1 filteredArrayUsingPredicate:pre1]);
    
    
    
    NSArray *arr2=@[@1,@6,@3];
    NSPredicate *pre2 = [NSPredicate predicateWithFormat:@"SELF BETWEEN{1,3}"];
    NSArray *arr3=[arr2 filteredArrayUsingPredicate:pre2];
    NSLog(@"%@",arr3);
    
    //在谓词里面使用BETWEEN在什么之间,如果不想用任何实例方法,想筛选成员本身应该怎么做呢,这时候就用self来代替; CONTAINS包含
    //返回结果的类NSTextCheckingResult
    //待检测的字符串
    NSString *searchText = @"12345";
    //定义错误
    NSError *error = NULL ;
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"^[0-9]+$" options:NSRegularExpressionCaseInsensitive error:&error];
    //返回第一个匹配结果
    NSTextCheckingResult *result = [regex firstMatchInString:searchText options:0 range:NSMakeRange(0, [searchText length])];
    
    //若匹配成功
    if (result) {
        //输出匹配结果
        NSLog(@"%@",[searchText substringWithRange:result.range]);
    }

就现在来说,在我们的APP中,用到的最多的应该也是对手机号进行判断了,输入手机号收验证码或者将手机号最为账号都是很普遍的情况,我们来看下怎么对三大运营商的手机号进行判断.

//验证手机号
+ (BOOL)isValidateMobile:(NSString *)mobileNum{

/**
 * 手机号码
 * 移动:134[0-8],135,136,137,138,139,150,151,157,158,159,182,187,188
 * 联通:130,131,132,152,155,156,185,186
 * 电信:133,1349,153,180,189
 */
NSString * MOBILE = @"^1(3[0-9]|5[0-35-9]|8[025-9])\\d{8}$";
/**
 10         * 中国移动:China Mobile
 11         * 134[0-8],135,136,137,138,139,150,151,157,158,159,182,184,187,188
 12         */
NSString * CM = @"^1(34[0-8]|(3[5-9]|5[017-9]|8[2478])\\d)\\d{7}$";
/**
 15         * 中国联通:China Unicom
 16         * 130,131,132,152,155,156,185,186
 17         */
NSString * CU = @"^1(3[0-2]|5[256]|8[56])\\d{8}$";
/**
 20         * 中国电信:China Telecom
 21         * 133,1349,153,180,189
 22         */
NSString * CT = @"^1((33|53|8[09])[0-9]|349)\\d{7}$";
/**
 25         * 大陆地区固话及小灵通
 26         * 区号:010,020,021,022,023,024,025,027,028,029
 27         * 号码:七位或八位
 28         */// NSString * PHS = @"^0(10|2[0-5789]|\\d{3})\\d{7,8}$";

NSPredicate *regextestmobile = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", MOBILE];
NSPredicate *regextestcm = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CM];
NSPredicate *regextestcu = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CU];
NSPredicate *regextestct = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CT];

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

推荐阅读更多精彩内容