NSRegularExpression iOS自带的正则表达式
以前做验证邮箱,电话号码的时候通常用第三方的正则表达式或者NSPredicate(点这里查看以前的文章),在后期,苹果推出了自己的正则表达式来提供给开发者调用,很方便,功能也强大. 具体可以查看官方文档,包括如何书写进行匹配的正则表达式例子,这里我就不多加详述了,因为本人看那一堆符号好烦.....只好直接求助于谷歌了,下面只给出几个常用的. #define KPhoneRegex @"\\d{3}-\\d{8}|\\d{3}-\\d{7}|\\d{4}-\\d{8}|\\d{4}-\\d{7}|1+[358]+\\d{9}|\\d{8}|\\d{7}"
#define KWebRegex @"((http[s]{0,1}|ftp)://[a-zA-Z0-9\\.\\-]+\\.([a-zA-Z]{2,4})(:\\d+)?(/[a-zA-Z0-9\\.\\-~!@#$%^&*+?:_/=<>]*)?)|(www.[a-zA-Z0-9\\.\\-]+\\.([a-zA-Z]{2,4})(:\\d+)?(/[a-zA-Z0-9\\.\\-~!@#$%^&*+?:_/=<>]*)?)"
#define KWebOtherRegex @"http+:[^\\s]*"
#define KEmailRegex @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}" /**
1. 返回所有匹配结果的集合(适合,从一段字符串中提取我们想要匹配的所有数据)
* - (NSArray *)matchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;
2. 返回正确匹配的个数(通过等于0,来验证邮箱,电话什么的,代替NSPredicate)
* - (NSUInteger)numberOfMatchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;
3. 返回第一个匹配的结果。注意,匹配的结果保存在 NSTextCheckingResult 类型中
* - (NSTextCheckingResult *)firstMatchInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;
4. 返回第一个正确匹配结果字符串的NSRange
* - (NSRange)rangeOfFirstMatchInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;
5. block方法
* - (void)enumerateMatchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range usingBlock:(void (^)(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop))block;
*/ /**
* enum {
NSRegularExpressionCaseInsensitive = 1 << 0, // 不区分大小写的
NSRegularExpressionAllowCommentsAndWhitespace = 1 << 1, // 忽略空格和# -
NSRegularExpressionIgnoreMetacharacters = 1 << 2, // 整体化
NSRegularExpressionDotMatchesLineSeparators = 1 << 3, // 匹配任何字符,包括行分隔符
NSRegularExpressionAnchorsMatchLines = 1 << 4, // 允许^和$在匹配的开始和结束行
NSRegularExpressionUseUnixLineSeparators = 1 << 5, // (查找范围为整个的话无效)
NSRegularExpressionUseUnicodeWordBoundaries = 1 << 6 // (查找范围为整个的话无效)
};
typedef NSUInteger NSRegularExpressionOptions;
*/ // 下面2个枚举貌似都没什么意义,除了在block方法中,一般情况下,直接给0吧
/**
* enum {
NSMatchingReportProgress = 1 << 0,
NSMatchingReportCompletion = 1 << 1,
NSMatchingAnchored = 1 << 2,
NSMatchingWithTransparentBounds = 1 << 3,
NSMatchingWithoutAnchoringBounds = 1 << 4
};
typedef NSUInteger NSMatchingOptions;
*/ /** 此枚举值只在5.block方法中用到
* enum {
NSMatchingProgress = 1 << 0,
NSMatchingCompleted = 1 << 1,
NSMatchingHitEnd = 1 << 2,
NSMatchingRequiredEnd = 1 << 3,
NSMatchingInternalError = 1 << 4
};
typedef NSUInteger NSMatchingFlags;
*/ // 测试字符串,把里面的电话号码解析出来
NSString *urlString = @"哈哈哈哈呵呵呵s15279107723在这里啊啊啊啊s15279107716";
NSError *error = NULL;
// 根据匹配条件,创建了一个正则表达式(类方法,实例方法类似)
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:KPhoneRegex options:NSRegularExpressionCaseInsensitive error:&error];
if (regex != nil) {
// 3.....
NSTextCheckingResult *firstMatch = [regex firstMatchInString:urlString
options:0
range:NSMakeRange(0, [urlString length])];
if (firstMatch) {
NSRange resultRange = [firstMatch rangeAtIndex:0];
//从urlString中截取数据
NSString *result = [urlString substringWithRange:resultRange];
NSLog(@"result = %@",result);
}
// 2.....
NSUInteger number = [regex numberOfMatchesInString:urlString
options:0
range:NSMakeRange(0, [urlString length])];
NSLog(@"number = %ld",number);
// 5.....(坑爹的返回第一个匹配结果)
[regex enumerateMatchesInString:urlString options:0 range:NSMakeRange(0, [urlString length]) usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {
NSLog(@"---%@",NSStringFromRange([result range]));
if (flags != NSMatchingInternalError) {
NSRange firstHalfRange = [result rangeAtIndex:0];
if (firstHalfRange.length > 0) {
NSString *resultString1 = [urlString substringWithRange:firstHalfRange];
NSLog(@"result1 = %@",resultString1);
}
}
*stop = YES;
}];
} // 替换掉你要匹配的字符串
NSString *reString = [regex stringByReplacingMatchesInString:urlString
options:0
range:NSMakeRange(0, [urlString length])
withTemplate:@"(我就是替换的值)"];
NSLog(@"reString = %@",reString);
// 还有2个方法大家可以去尝试看看 // 1.
NSMutableArray *oneArray = [self _matchLinkWithStr:urlString withMatchStr:KPhoneRegex];
for (NSString *phone in oneArray) {
NSLog(@"phone = %@",phone);
} // 1.....
- (NSMutableArray *)_matchLinkWithStr:(NSString *)str withMatchStr:(NSString *)matchRegex;
{
NSError *error = NULL;
NSRegularExpression *reg = [NSRegularExpression regularExpressionWithPattern:matchRegex
options:NSRegularExpressionCaseInsensitive
error:&error];
NSArray *match = [reg matchesInString:str
options:NSMatchingReportCompletion
range:NSMakeRange(0, [str length])]; NSMutableArray *rangeArr = [NSMutableArray array];
// 取得所有的NSRange对象
if(match.count != 0)
{
for (NSTextCheckingResult *matc in match)
{
NSRange range = [matc range];
NSValue *value = [NSValue valueWithRange:range];
[rangeArr addObject:value];
}
}
// 将要匹配的值取出来,存入数组当中
__block NSMutableArray *mulArr = [NSMutableArray array];
[rangeArr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSValue *value = (NSValue *)obj;
NSRange range = [value rangeValue];
[mulArr addObject:[str substringWithRange:range]];
}];
return mulArr;
}
@结果:
NSRegularExpression iOS自带的正则表达式的更多相关文章
- iOS中3种正则表达式的使用与比较
正则表达式在用户注册和登录中应用很广,通过正则表达式可以判断用户输入的数据正确与否. 在iOS4.0以前开发者一般是通过谓词(NSPredicate)和加入正则表达式的第三方库(如:RegexKitL ...
- ios自带的返回按键,点击不刷新页面
1.因为是微信端页面,需要获取用户基本信息和设置微信分享朋友圈等功能,ios自带的返回键没有这个功能,导致config配置不成功,该隐藏的按钮没有隐藏. 解决方法,在子页面添加一下js代码即可.链接的 ...
- IOS自带输入法中文不触发KEYUP事件导致vue双向绑定错误问题
先上图: 可以看到输入框中的内容和弹出框的内容不一致, <input class="am-fr labRight" id="txcode" type=&q ...
- [原] corePlot 类库与iOS自带类库使用方法对比(很多开源代码都有这个特点)
——人类最倚重的是自己的“以往经验”.—— 我们直接看一下在corePlot 类库和iOS自带类中为一个控件设置文本显示格式的实现. * corePlot 类库中,为一个对象设置标题显示格式 , ...
- iOS自带TTS技术的实现即语音播报
文本转语音技术, 也叫TTS, 是Text To Speech的缩写. iOS如果想做有声书等功能的时候, 会用到这门技术. 一,使用iOS自带TTS需要注意的几点: iOS7之后才有该功能 需要 A ...
- iOS学习笔记之正则表达式
前言 基本上每个 App 都有登录注册功能,在登录注册时需要验证用户所输入的内容是否符合规定:有时要在字符串中查找并截取符合要求的字符串,这时就需要用到正则表达式.正则表达式看起来晦涩难懂,没有什么规 ...
- iOS自带地图纠偏问题
…………纠偏 篇………….. 1. 涉及接口:<CoreLocation/CoreLocation.h> 2. 核心代码解读: if ([CLLocationManager locatio ...
- iOS:详细的正则表达式
1.简介: 在项目中,正则的使用是很普遍的,例如登录账号和密码(手机号.邮箱等).用到的方法就是谓词对象过滤:NSPredicate. 2.什么是正则表达式: 正则表达式,又称正规表示法,是对字符串操 ...
- (转)iOS中3种正则表达式的使用与比较
.利用NSPredicate(谓词)匹配 例如匹配有效邮箱: NSString *email = @“nijino_saki@.com”: NSString *regex = @"[A-Z0 ...
随机推荐
- 初识Python、数据类型、基本语句
Python是一种面向对象的.直译式计算机程序设计语言,也是一种功能强大的且完善的通用型语言,是一种脚本语言. Python的主要特点:是面向过程的.面向对象的:模块丰富,功能强大:语法简单易学:扩展 ...
- vs编译程序不能实现,“未能完成操作 未指定的错误”的解决办法
1.先把.vcproj 文件剪切到其他地方 2.打开.sln,报错->点“确定”->再点“确定” 3.把 .vcproj 文件 放回来,在vs2005右边的“解决方案”处右键 重新加载,就 ...
- unity里c# gc优化 -字符串
1使用unsafe,直接修改字符串 public static class UnsafeString { public static unsafe void Copy(this string str, ...
- Python中何时使用断言(转)
原文:http://blog.jobbole.com/76285/ 本文由 伯乐在线 - 贱圣OMG 翻译.未经许可,禁止转载!英文出处:python maillist.欢迎加入翻译小组. 这个问题是 ...
- 基于websocket搭建简易群聊
1.前端HTML <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset=&qu ...
- Java输入输出重定向代码
try { BufferedInputStream in = new BufferedInputStream(new FileInputStream("input.txt")) ...
- vue+django前后端分析解决csrf token问题
vue-resource post数据 参考:https://www.cnblogs.com/linxizhifeng/p/8995077.html 阅读django CsrfViewMiddlewa ...
- python操作——RabbitMQ
RabbitMQ是一个在AMQP基础上完整的,可服用的企业消息系统.他遵循Mozilla Public License开源协议. MQ全称为Message Queue,消息队列(MQ)是一种应用程序对 ...
- bootstrap-select 使用笔记 设置选中值及手动刷新
直接笔记: 1.页面刚加载完填充select选项数据时,需要手动刷新一下组件,否则没有选项值.(组件初始化时,li 与 option 分离的,需要刷新一下(据说)) $.post('/cpms/tod ...
- 【转】Python的hasattr() getattr() setattr() 函数使用方法详解
Python的hasattr() getattr() setattr() 函数使用方法详解 hasattr(object, name)判断一个对象里面是否有name属性或者name方法,返回BOOL值 ...