App的实际应用中,用户登陆功能基本是每个App都有需求的一个功能。而当前我们很常规的做法,就是让用户把手机号作为自己的用户名,而在注册获取短信验证码的过程中,我们首先要完成的一个步骤,就是校验用户的手机号是否是符合规则的手机号,而这种问题,一般称之为字符串匹配问题。

当遇到字符串匹配问题时,有一种常用的解决方法就是正则表达式。通过iOS中的NSRegularExpression这个类就可以帮助我们实现这个。

下面先来介绍一下正则表达式的基本语法。

正则表达式基本语法

正则表达式常见字符

    test            # 匹配包含test的字符串
. # 匹配除换行符外任意字符
\ # 转义字符
[abc]或[a-c] # 匹配字符类,如例子匹配a,b,c中的任何一个
[^abc] # 匹配除了a,b,c以外的所有字符

正则表达式特殊字符

\d                  # 数字,等同于[0-9]
\D # 非数字
\s # 空白字符(包括换行、Tab等)
\S # 非空白字符
\w # 单词,等用于[a-zA-Z0-9_]
\W # 非单词

正则表达式数量词

c*                  # 匹配字符"c" 0或无限次
c+ # 匹配字符"c" 1次以上
c? # 匹配字符"c" 0或1次
c{3} # 匹配字符"c" 3次
c{3,5} # 匹配字符"c" 3到5次

正则表达式边界匹配

^abc                # 匹配"abc"开头的字符串
abc$ # 匹配"abc"结尾的字符串

正则表达式逻辑或分组

c|b                 # 匹配"c"或"b"
(ab|cd) # 匹配"ab"或"cd"
(?P<name>abc) # 匹配"abc"并命名为name
(?P=name) # 前文中的name组

实例分析 匹配用户手机号

根据上面的语法,我用OC语言写出来的正则表达式匹配手机号的代码如下:

NSString *pattern = @"^1+[3578]+\\d{9}";
NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pattern];
BOOL isMatch = [pred evaluateWithObject:telNumber];
return isMatch;

我们来分析我写的这段正则表达式,首先是边界匹配^1手机号一定是1开头,所以我们的开头用边界匹配1。

[3578] 我们用中括号[]来匹配字符类,说明第二位数字是3、5、7、8中任意一个就可以,目前17也是新开号段,所以得考虑进去匹配上。

最后\d{9}这里要拆分开看,首先\d表示数字,等同于[0-9],而{9}表示匹配数字\d 9次。这样,就完成了一个11位手机号码的校验。

封装常用的正则表达式方法

在这里,我把常用的正则表达式的匹配方法,封装起来,项目中基本都会用到

以下是.h头文件中的声明
#pragma 正则匹配手机号
+ (BOOL)checkTelNumber:(NSString *) telNumber;
#pragma 正则匹配用户密码6-18位数字和字母组合
+ (BOOL)checkPassword:(NSString *) password;
#pragma 正则匹配用户姓名,20位的中文或英文
+ (BOOL)checkUserName : (NSString *) userName;
#pragma 正则匹配用户身份证号
+ (BOOL)checkUserIdCard: (NSString *) idCard;
#pragma 正则匹配URL
+ (BOOL)checkURL : (NSString *) url;
以下是.m文件中的具体实现,直接复制到自己的项目中即可用
#pragma 正则匹配手机号
+ (BOOL)checkTelNumber:(NSString *) telNumber
{
NSString *pattern = @"^1+[3578]+\\d{9}";
NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pattern];
BOOL isMatch = [pred evaluateWithObject:telNumber];
return isMatch;
} #pragma 正则匹配用户密码6-18位数字和字母组合
+ (BOOL)checkPassword:(NSString *) password
{
NSString *pattern = @"^(?![0-9]+$)(?![a-zA-Z]+$)[a-zA-Z0-9]{6,18}";
NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pattern];
BOOL isMatch = [pred evaluateWithObject:password];
return isMatch; } #pragma 正则匹配用户姓名,20位的中文或英文
+ (BOOL)checkUserName : (NSString *) userName
{
NSString *pattern = @"^[a-zA-Z\u4E00-\u9FA5]{1,20}";
NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pattern];
BOOL isMatch = [pred evaluateWithObject:userName];
return isMatch; } #pragma 正则匹配用户身份证号15或18位
+ (BOOL)checkUserIdCard: (NSString *) idCard
{
NSString *pattern = @"(^[0-9]{15}$)|([0-9]{17}([0-9]|X)$)";
NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pattern];
BOOL isMatch = [pred evaluateWithObject:idCard];
return isMatch;
} #pragma 正则匹员工号,12位的数字
+ (BOOL)checkEmployeeNumber : (NSString *) number
{
NSString *pattern = @"^[0-9]{12}"; NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pattern];
BOOL isMatch = [pred evaluateWithObject:number];
return isMatch; } #pragma 正则匹配URL
+ (BOOL)checkURL : (NSString *) url
{
NSString *pattern = @"^[0-9A-Za-z]{1,50}";
NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pattern];
BOOL isMatch = [pred evaluateWithObject:url];
return isMatch;
}

今天的正则表达式就分析到这里,正则表达式的关键点,还是根据语法来自己判断,实在不行,就敲敲代码实践咯~

文/Originalee(简书作者)

原文链接:http://www.jianshu.com/p/a3dd72eadfa3

著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

IOS开发——正则表达式验证手机号、密码的更多相关文章

  1. iOS - OC/Swift:验证手机号/固话用正则表达式

    /** * 验证手机号是否正确 * @param unknown_type $mobile */ OC: - (BOOL)isMobileNumber:(NSString *)mobileNum { ...

  2. Android 正则表达式验证手机号、姓名(包含少数民族)、身份证号

    最近项目中新增的功能,需要对手机号.姓名.身份证号等一些信息进行验证,最好的方法是通过正则表达式来验证,网上查了一些资料,写了这几个工具方法. 1.验证手机号 规则:第一位只能是1,第二位为3-8中的 ...

  3. JS正则表达式验证手机号和邮箱

    一.验证手机号 function isPoneAvailable(poneInput) { var myreg=/^[1][3,4,5,7,8][0-9]{9}$/; if (!myreg.test( ...

  4. Android中利用正则表达式验证手机号是否合法

    利用正则表达式来验证手机号是否合法,现在我们简单使用一下,这个在实际的应用中很实用. 例:在输入框中输入手机号,判断是否合法, MainActivity中: package com.example.m ...

  5. iOS常用正则表达式验证(手机号、密码格式、身份证号等)

    #import @interfaceUtils : NSObject #pragma 正则匹配手机号 + (BOOL)checkTelNumber:(NSString*) telNumber; #pr ...

  6. iOS开发之判断手机号和邮箱 正则表达式

    #pragma mark --判断手机号合法性 + (BOOL)checkPhone:(NSString *)phoneNumber { NSString *regex = @"^((13[ ...

  7. iOS开发正则表达式的学习

    正则表达式笔记 每天的一小步,知道我在不断进步,这就是我每天的小目标. 这是我的第一篇博客,在工作之余,我会努力地留下些许脚印. 我是一名iOS开发者,对于iOS我仅仅只是一个菜鸟,愿意在此处留下我的 ...

  8. iOS开发--正则表达式

    目录[-] 正则表达式简单语法总结 一.什么是正则表达式 二.正则表达式的基础语法 1.字面值 2.特殊字符(元字符) (1)句号 (2)字符类([]) (3)区间符号(-) (4)取反符号(^) ( ...

  9. Android使用正则表达式验证手机号

    国内手机号代码段分配如下: 移动:134.135.136.137.138.139.150.151.157(TD).158.159.187.188 联通:130.131.132.152.155.156. ...

随机推荐

  1. AndroidUI 视图动画-混合动画效果 (AnimationSet)/动画效果监听

    在前面介绍了几种动画效果:透明动画效果(AlphsAnimation).移动动画效果(TranslateAnimation).旋转动画效果(RotateAnimation).缩放动画效果(ScaleA ...

  2. 精通CSS+DIV基础总结(一)

    这段时间学习了玩了DIV+CSS的视频,感觉效率不高.前边的Javascript总结的不好,但是看了后边的JQuery,觉得学习的再多一点,再进行Javascript的总结.DIV+CSS总结,估计会 ...

  3. MVC中Json的使用:Controller中Json的处理【转】

    一.当查询得到的数据符合前台要求,不需要做任何处理,直接DataList To Json 返回前台. 代码: , out recordCount); return Json(allEntities, ...

  4. HDU 2602 Bone Collector - from lanshui_Yang

           题目大意:有n件物品,每件物品均有各自的价值和体积,给你一个容量为 V 的背包,问这个背包最多能装的物品的价值是多少?        解题思路:这是一道0 - 1 背包的简单模板题,也是 ...

  5. web开发 - 从零开始 - 01 - 常见样式

    1.width  &  height 2.background : a.background-color b.background-image:url() c.background-repea ...

  6. PHP自学1——简单表单提交

    最近自学PHP,顺便做个笔记记录一下自己的学习进度.选用的教程是<PHP and MySQL Web Development 4th Edition>,建议阅读英文教材(我能说英文网上免费 ...

  7. Nodejs随笔(一):Hello World!

    声明:本人用的是Ubuntu 14.04 LTS 系统. 一.Nodejs安装: <1>直接apt-get安装,最简单:sudo apt-get install nodejs <2& ...

  8. BZOJ 1396: 识别子串( 后缀数组 + 线段树 )

    这道题各位大神好像都是用后缀自动机做的?.....蒟蒻就秀秀智商写一写后缀数组解法..... 求出Height数组后, 我们枚举每一位当做子串的开头. 如上图(x, y是height值), Heigh ...

  9. [LeetCode]题解(python):147-Insertion Sort List

    题目来源: https://leetcode.com/problems/insertion-sort-list/ 题意分析: 用插入排序排序一个链表. 题目思路: 这题没什么好说的,直接用插入排序就行 ...

  10. 使用百度语音识别REST API,做全平台语音识别

    百度语音开发介绍文档: http://yuyin.baidu.com/docs/asr# 使用语音识别,需要在百度申请一个应用,然后拿到API Key和Secret Key,然后才可以使用语音识别 p ...