iOS 中的正则匹配(工具类方法)
正则表达式
正则表达式是对字符串操作的一种逻辑公式, 用事先定义好的一些特定字符、及这些特定字符的组合, 组成一个"规则字符串",
这个"规则字符串"用来表达对字符串的一种过滤逻辑, 正则表达式就是用于描述这些规则的工具, 或者说, 正则表达式就是记录文本规则的代码.
在开发中, 我们经常会有查找符合某些复杂规则的字符串的需要,
比如数据校验: 判断用户的输入是否合法(如:用户注册的时候,QQ号码,电话号码,邮箱是否符合要求)
下面让我们先来看看正则匹配常用的一些字符:
一. 常用通配符
. 匹配除换行符以外的任意字符
\w 匹配字母或数字或下划线或汉字
\s 匹配任意的空白符(空格,tab\t,回车\r \n)
\d 匹配数字
^ 匹配字符串的开始
$ 匹配字符串的结束
\b 匹配单词的开始或结束
二. 常用反义通配符
\W 匹配任意不是字母,数字,下划线,汉字的字符
\S 匹配任意不是空白符的字符
\D 匹配任意非数字的字符
\B 匹配不是单词开头或结束的位置
[^x] 匹配除了x以外的任意字符
[^aeiou] 匹配除了aeiou这几个字母以外的任意字符
三. 集合
[xyz] 匹配xyz中任意的字符
[^xyz] 匹配不是xyz中的任意字符
[a-z] 匹配从小写字母a到小写字母z之间的任意字符
[^a-z] 匹配非从小写字母a到小写字母z之间的任意字符
四. 常用限定符
* 重复零次或更多次
+ 重复一次或更多次
? 重复零次或一次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次
五. 贪婪和懒惰模式(默认是贪婪模式;在量词后面直接加上问号,就是非贪婪模式)
*? 重复任意次,但尽可能少重复
+? 重复一次或更多次,但尽可能少重复
?? 重复零次或一次,但尽可能少重复
{n,m}? 重复n到m次,但尽可能少重复
{n,}? 重复n次以上,但尽可能少重复
以上就是正则表达式的匹配规则需要使用到的字符.
下面是我在开发中时常用到的和平时收集的一些正则匹配,为了后续方便,所以整理下封装成一个工具类,提供类方法来调用,返回匹配结果.
或许上面的匹配字符有些朋友看不太明白,那就不说废话了,上代码,多看几次,然后自己尝试着去写,很快就可以明白了.
- RegularTool.h
//
// RegularTool.h
// 正则匹配
//
// Created by Arvin on 15/12/3.
// Copyright © 2015年 Arvin. All rights reserved.
// #import <Foundation/Foundation.h> typedef void(^resultBlock)(NSString *res); @interface RegularTool: NSObject /*!
* 匹配固定电话号码
*
* @param number 需要匹配的固话号码
*
* @return 返回匹配结果
*/
+ (NSString *)matchTelephoneNumber:(NSString *)number; /*!
* 匹配手机号码
*
* @param number 需要匹配的手机号码
*
* @return 返回匹配结果
*/
+ (NSString *)matchMobilephoneNumber:(NSString *)number; /*!
* 匹配3-15位的中文或英文(用户名)
*
* @param username 需要匹配的字符串
*
* @return 返回匹配结果
*/
+ (NSString *)matchUsername:(NSString *)username; /*!
* 匹配6-18位的数字和字母组合(密码)
*
* @param password 需要匹配的字符串
*
* @return 返回匹配结果
*/
+ (NSString *)matchPassword:(NSString *)password; /*!
* 匹配邮箱帐号
*
* @param email 需要匹配的邮箱帐号
*
* @return 返回匹配结果
*/
+ (NSString *)matchEmail:(NSString *)email; /*!
* 匹配身份证号码
*
* @param idCard 需要匹配的身份证号码
*
* @return 返回匹配结果
*/
+ (NSString *)matchUserIdCard:(NSString *)idCard; /*!
* 匹配URL字符串
*
* @param urlStr 需要匹配的URL字符串
*
* @return 返回匹配结果
*/
+ (NSString *)matchURLStr:(NSString *)urlStr; /*!
* 匹配¥:价格字符串
*
* @param priceStr 包含价格的字符串
*
* @return 返回匹配结果
*/
+ (BOOL)matchPriceStr:(NSString *)priceStr; @end
- RegularTool.m
//
// RegularTool.m
// 正则匹配
//
// Created by Arvin on 15/12/3.
// Copyright © 2015年 Arvin. All rights reserved.
// #import "RegularTool.h" @implementation RegularTool #pragma mark - 匹配固定电话号码
+ (NSString *)matchTelephoneNumber:(NSString *)number {
NSString *pattern = @"^(\\d{3,4}-)\\d{7,8}$";
__block NSString *result;
[RegularTool matchString:number withPattern:pattern resultBlock:^(NSString *res) {
result = res;
}];
return result;
} #pragma mark - 匹配手机号码
+ (NSString *)matchMobilephoneNumber:(NSString *)number {
NSString *pattern = @"^(0|86)?1([358][0-9]|7[678]|4[57])\\d{8}$";
__block NSString *result;
[RegularTool matchString:number withPattern:pattern resultBlock:^(NSString *res) {
result = res;
}];
return result;
} #pragma mark - 匹配3-15位的中文或英文(用户名)
+ (NSString *)matchUsername:(NSString *)username {
NSString *pattern = @"^[a-zA-Z一-龥]{3,15}$";
__block NSString *result;
[RegularTool matchString:username withPattern:pattern resultBlock:^(NSString *res) {
result = res;
}];
return result;
} #pragma mark - 匹配6-18位的数字和字母组合(密码)
+ (NSString *)matchPassword:(NSString *)password {
NSString *pattern = @"^(?![0-9]+$)(?![a-zA-Z]+$)[a-zA-Z0-9]{6,18}$";
__block NSString *result;
[RegularTool matchString: password withPattern: pattern resultBlock:^(NSString *res) {
result = res;
}];
return result;
} #pragma mark - 匹配邮箱帐号
+ (NSString *)matchEmail:(NSString *)email {
NSString *pattern =
@"^[a-z0-9]+([\\._\\-]*[a-z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+\\.){1,63}[a-z0-9]+$";
__block NSString *result;
[RegularTool matchString:email withPattern:pattern resultBlock:^(NSString *res) {
result = res;
}];
return result;
} #pragma mark - 匹配身份证号码
+ (NSString *)matchUserIdCard:(NSString *)idCard {
NSString *pattern =
@"(^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}$)|(^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])((\\d{4})|\\d{3}[Xx])$)";
__block NSString *result;
[RegularTool matchString:idCard withPattern:pattern resultBlock:^(NSString *res) {
result = res;
}];
return result;
} #pragma mark - 匹配URL字符串
+ (NSString *)matchURLStr:(NSString *)urlStr {
NSString *pattern = @"^[0-9A-Za-z]{1,50}$";
__block NSString *result;
[RegularTool matchString:urlStr withPattern: pattern resultBlock:^(NSString *res) {
result = res;
}];
return result;
} #pragma mark - 匹配¥:价格字符串
+ (BOOL)matchPriceStr:(NSString *)priceStr {
NSError *error = nil;
NSString *pattern = @"¥(\\d+(?:\\.\\d+)?)";
NSRegularExpression *regular = [NSRegularExpression regularExpressionWithPattern:pattern options: << error: &error];
if (!error) {
NSArray<NSTextCheckingResult *> *result = [regular matchesInString:priceStr options:NSMatchingWithoutAnchoringBounds range:NSMakeRange(, priceStr.length)];
if (result) {
for (NSTextCheckingResult *checkingRes in result) {
if (checkingRes.range.location == NSNotFound) {
continue;
}
NSLog(@"%@",[priceStr substringWithRange:checkingRes.range]);
//NSLog(@"%@",[priceStr substringWithRange:[res rangeAtIndex:1]]);
}
}
return YES;
}
NSLog(@"匹配失败,Error: %@",error);
return NO;
} /*!
* 正则匹配
*
* @param str 匹配的字符串
* @param pattern 匹配规则
*
* @return 返回匹配结果
*/
+ (BOOL)matchString:(NSString *)str withPattern:(NSString *)pattern resultBlock:(resultBlock)block {
NSError *error = nil;
NSRegularExpression *regular = [NSRegularExpression regularExpressionWithPattern: pattern options: NSRegularExpressionCaseInsensitive error: &error];
if (!error) {
NSTextCheckingResult *result = [regular firstMatchInString:str options: range:NSMakeRange(, str.length)];
if (result) {
NSLog(@"匹配成功");
block([str substringWithRange:result.range]);
return YES;
} else {
NSLog(@"匹配失败");
return NO;
}
}
NSLog(@"匹配失败,Error: %@",error);
return NO;
} @end
END! 欢迎留言交流,一起学习...
iOS 中的正则匹配(工具类方法)的更多相关文章
- 通用且常用的Java正则匹配工具,用以检查邮箱名、电话号码、用户密码、邮政编码等合法性
一个通用且常用的Java正则匹配工具,用以检查邮箱名.电话号码.用户密码.邮政编码等合法性. import java.util.regex.Matcher; import java.util.rege ...
- iOS中使用正则
一.什么是正则表达式 正则表达式,又称正规表示法,是对字符串操作的一种逻辑公式.正则表达式可以检测给定的字符串是否符合我们定义的逻辑,也可以从字符串中获取我们想要的特定部分.它可以迅速地用极简单的方式 ...
- Word中类似正则匹配的查找替换通配符的使用详解
一.Word查找栏代码&通配符一览表 序号 清除使用通配符复选框 勾选使用通配符复选框 特殊字符 代码 特殊字符 代码or通配符 1 任意单个字符 ^? 任意单个字符 ? 2 任意数字 ^# ...
- 在notepad++中使用正则匹配功能(一-龥!-~) 中文[利刃篇]
用正则时间越久,人就越懒,就越知道正则的强大.正则,不只是在代码里用到,在字符查找是也会用到,学会适当使用正则,将会使你的工作事办功倍!但是,中文却是一个砍,不容易过. 于是在用notepad++,也 ...
- javascript 中利用正则匹配 时间
本文从百度知道回来中粘贴过来,当做一个笔记,因为,说的很详细 最简单的正则 如 : \d{4}-\d{2}-\d{2}但是实际情况却不是那么简单,,要考虑,有效性和闰年等问题..... 对于日期的有效 ...
- iOS 中的第三方库管理工具
xcode没有android studio中的gradle进行第三方库管理,但是有第三方的库管理工具CocoaPods,https://github.com/CocoaPods/CocoaPods/w ...
- Hive 9、Hive 在表中添加正则匹配
在Hive中还有一项比较好用的功能,也是非常重要的功能:在建表的时候可以不指定表的行.字段.列的分隔方式,通过给表指定一段正则表达式,让Hive自动去匹配: 1.创建表 CREATE TABLE ap ...
- Django2.0 和 Django1 中的正则匹配问题
2.0内的path匹配正则时候无效时,导入re_path即可 from django.urls import path,re_path from king_admin import views url ...
- javascript中的正则匹配函数exec(),test(),match()
test() var str = "cat";var reStr = /cat/;alert(reStr.test(str)); 输出为:true 它的返回值为true or fa ...
随机推荐
- UIView / UIView的布局
//! 一个视图可以有n个子视图,但是一个视图只能有一个父视图 struct CGRect { CGPoint origin; CGSize size; }; CGRectMake(CGFlo ...
- Jboss基础及简单的应用
初学Jboss,对于Jboss的基础认识以及配置做一些记录 Jboss基础: JBoss是什么–基于J2EE的应用服务器–开放源代码–JBoss核心服务不包括支持servlet/JSP的WEB容器,一 ...
- js判断上传文件的类型和大小
//检测文件大小和类型 function fileChange(target){ //检测上传文件的类型 if(!(/(?:jpg|gif|png|jpeg)$/i.test(target.value ...
- 在子jsp页面中调用父jsp中的function或父jsp调用子页面中的function
项目场景: A.jsp中有一个window,window里嵌入了一个<iframe>,通过<iframe>引入了另一个页面B.jsp.在B.jsp中的一个function中需要 ...
- 函数:我的地盘听我的 - 零基础入门学习Python019
函数:我的地盘听我的 让编程改变世界 Change the world by program 函数与过程 在小甲鱼另一个实践性超强的编程视频教学<零基础入门学习Delphi>中,我们谈到了 ...
- 去掉Eclipse打开后定期弹出Usage Data Upload对话框
Eclipse 的 UDC 老定期蹦出来说要上传使用数据到 eclipse 官网服务器去除方法: 1.删除 eclipse/plugins 目录下以 org.eclipse.epp.usagedata ...
- C语言编程时常犯十八个错误
C语言的最大特点是:功能强.使用方便灵活.C编译的程序对语法检查并不象其它高级语言那么严格,这就给编程人员留下“灵活的余地”,但还是由于这个灵活给程序的调试带来了许多不便,尤其对初学C语言的人来说,经 ...
- Android 代码编辑器中实现代码语法高亮
想写一款Android手机上的代码编辑器,实现类似c4droid中代码语法高亮 通过Android中的控件WebView中嵌入html网页,html引入CodeMirror这个第三方库就可以了,其实就 ...
- MySQL表复制
http://www.2cto.com/database/201202/120259.html http://www.cnblogs.com/sunss/archive/2010/10/08/1845 ...
- 一键安装IIS的点点滴滴——For所有Microsoft的操作系统(下)
原文 http://www.cnblogs.com/cdts_change/archive/2010/03/09/1681392.html 接着上一篇的讲,下面我们将讨论Windows7.Window ...