iOS_正則表達式
iOS 正則表達式
正則表達式,又称正规表示法、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE)。计算机科学的一个概念。
正則表達式使用单个字符串来描写叙述、匹配一系列符合某个句法规则的字符串。在非常多文本编辑器里。正則表達式通常被用来检索、替换那些符合某个模式的文本。
- 系统自带的, 如: NSPredicate, rangeOfString:option, NSRegularExpression
- RegexKitLite RegexKitLite 是一个轻量级的 Objective-C 的正則表達式库,支持 Mac OS X 和 iOS,使用 ICU 库开发。
至于RegexKitLite, 这里不做介绍。着重介绍系统自带的那几个办法。
PS: 阅读本文前提是您已经掌握了正则基本的语法, 假设对正则还不太了解, 能够參考以下几个链接:
正則表達式学习链接:
1. NSPredicate
简述:Cocoa框架中的NSPredicate用于查询,原理和使用方法都相似于SQL中的where。作用相当于数据库的过滤取。
NSPredicate *predicate = [NSPredicate predicateWithFormat:(NSString *), ...];
当中, 常见的Format有:
(1) 比較运算符: >, <, ==, >=, <=, !=
例:@"number > 100"
(2) 范围运算符: IN, BETWEEN
例:@"number BETWEEN {1,5}"
@"address IN {'shanghai','beijing'}"
(3) 字符串本身: SELF
例:@“SELF == ‘APPLE’"
(4) 字符串相关: BEGINSWITH, ENDSWITH, CONTAINS
例:@"name CONTAINS[cd] 'ang'" //包括某个字符串
@"name BEGINSWITH[c] 'sh'" //以某个字符串开头
@"name ENDSWITH[d] 'ang'" //以某个字符串结束
注:[c]不区分大写和小写
[d]不区分发音符号即没有重音符号
[cd]既不区分大写和小写,也不区分发音符号。
(5) 通配符: LIKE
例:@"name LIKE[cd] '*er*'" //*代表通配符,Like也接受[cd].
@"name LIKE[cd] '?
?
?er*'"
(6) 正則表達式: MATCHES
例:NSString *regex = @"^A.+e$"; //以A开头。e结尾
@"name MATCHES %@",regex
至于怎样使用呢?
以下举几个样例:
(a) 对NSArray进行过滤, 帅选出包括”ang”的项
NSArray *array = [[NSArray alloc]initWithObjects:@"beijing", @"shanghai", @"guangzou", @"wuhan", nil];
NSString *string = @"ang";
NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF CONTAINS %@", string];
NSLog(@"%@", [array filteredArrayUsingPredicate:pred]);
// 打印结果:
// (
// shanghai,
// guangzou
// )
(b) 对NSDate进行筛选
//日期在十天之内:
NSDate *endDate = [NSDate date];
NSTimeInterval timeInterval= [endDate timeIntervalSinceReferenceDate];
timeInterval -=3600*24*10;
NSDate *beginDate = [NSDate dateWithTimeIntervalSinceReferenceDate:timeInterval];
//对coredata进行筛选(假设有fetchRequest)
NSPredicate *predicate_date = [NSPredicate predicateWithFormat:@"date >= %@ AND date <= %@", beginDate,endDate];
[fetchRequest setPredicate:predicate_date];
OK, NSPredicate的功能非常多, 也非常强大。这里临时就点到此, 感兴趣的能够自己一一试验。
以下举两个样例说明一下怎样使用正则。
// 推断是否是有效邮箱
- (BOOL)isValidateEmail:(NSString *)email{
NSString *regex = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}";
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
return [predicate evaluateWithObject:email];
}
// 推断字符串首字母是否为字母
- (BOOL)isStartedWithWord:(NSString *)aString{
NSString *regex = @"[A-Za-z]+";
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
return [predicate evaluateWithObject:aString];
}
2. 利用rangeOfString:option:直接查找
NSString *searchText = @"// Do any additional setup after loading the view, typically from a nib.";
NSRange range = [searchText rangeOfString:@"(?:[^,])*\\." options:NSRegularExpressionSearch];
if (range.location != NSNotFound) {
NSLog(@"%@", [searchText substringWithRange:range]);
}
// 打印结果:
// typically from a nib.
options中设定NSRegularExpressionSearch就是表示利用正則表達式匹配,会返回第一个匹配结果的位置。
3. 使用正則表達式类
具体了解: iOS 正則表達式 NSRegularExpression
上面那篇文章总结的非常不错. 这里简单再举个样例:
NSString *searchText = @"// Do any additional setup after loading the view, typically from a nib.";
NSError *error = NULL;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(?:[^,])*\\." options:NSRegularExpressionCaseInsensitive error:&error];
NSTextCheckingResult *result = [regex firstMatchInString:searchText options:0 range:NSMakeRange(0, [searchText length])];
if (result) {
NSLog(@"%@\n", [searchText substringWithRange:result.range]);
}
// 打印结果:
// typically from a nib.
使用系统的正則表達式类(NSRegularExpression)会返回匹配的多个结果。
针对以上3种方式, 做一个小小总结
第一种匹配须要学习NSPredicate的写法。须要查阅苹果相关技术文档;
假设仅仅关心第一个匹配的结果。另外一种匹配较为简洁;
假设须要匹配多个结果,同一时候匹配多次,第三种方式效率会更高。
经常使用正則表達式
參考: IOS经常使用正則表達式
| 表达式 | 作用 |
|---|---|
| [\u4e00-\u9fa5] | 匹配中文字符 |
| [^\x00-\xff] | 匹配双字节字符(包括汉字在内) |
| \n\s*\r | 匹配空白行 |
| <(\S*?)[^>]*>.*?|<.*? /> | 匹配HTML标记 |
| ^\s*|\s*$ | 匹配首尾空白字符 |
| \w+([-+.]\w+)*@\w+([-.]\w+)*.\w+([-.]\w+)* | 匹配Email地 |
| [a-zA-z]+://[^\s]* | 匹配网址URL |
| \d{3}-\d{8}|\d{4}-\d{7} | 匹配国内电话号码,匹配形式如 0511-4405222 或 021-87888822 |
| [1-9]\d{5}(?!\d) | 匹配中国邮政编码 |
| \d+.\d+.\d+.\d+ | 匹配ip地址 |
iOS_正則表達式的更多相关文章
- js正則表達式语法
1. 正則表達式规则 1.1 普通字符 字母.数字.汉字.下划线.以及后边章节中没有特殊定义的标点符号,都是"普通字符".表达式中的普通字符,在匹配一个字符串的时候,匹配与之同样的 ...
- Java正則表達式入门
众所周知,在程序开发中,难免会遇到须要匹配.查找.替换.推断字符串的情况发生,而这些情况有时又比較复杂,假设用纯编码方式解决,往往会浪费程序猿的时间及精力.因此,学习及使用正則表達式,便成了解决这一 ...
- jquery+正則表達式验证邮箱格式的样例
js: $("#email").blur(function(){ //获取id相应的元素的值,去掉其左右的空格 var email = $.trim($('#email').val ...
- python使用正則表達式
python中使用正則表達式 1. 匹配字符 正則表達式中的元字符有 . ^ $ * + ? { } [ ] \ | ( ) 匹配字符用的模式有 \d 匹配随意数字 \D 匹配随意非 ...
- Java正則表達式语法
Java正則表達式语法 字符 说明 \ 将下一字符标记为特殊字符.文本.反向引用或八进制转义符.比如,"n"匹配字符"n"."\n"匹配换行 ...
- javascript正則表達式 "\b"问题
preface 昨晚在看<javascript权威指南>后.看见作者自己封装一个兼容全部浏览器的山寨HTML5新API classLIst类.自己想了想认为自己也要去玩一下.可是能力还是有 ...
- C++11中正則表達式測试
VC++2010已经支持regex了, 能够用来编译下述代码. #include <string> #include <regex> #include <iostream ...
- 深入浅出理解iOS经常使用的正則表達式—基础篇[Foundation]
參考资料:cocoachina的zys475481075的文章 几个单词 Regular ['regjʊlə]adj. 定期的:有规律的 Expression[ɪk'spreʃ(ə)n; ek-] n ...
- Linux正則表達式-反复出现的字符
星号(*)元字符表示它前面的正則表達式能够出现零次或多次.也就是说,假设它改动了单个字符.那么该字符能够在那里也能够不在那里,而且假设它在那里,那可能会不止出现一个.能够使用星号元字符匹配出如今引號中 ...
随机推荐
- asp.net 自定义的模板方法接口通用类型
本来想写这个帖子已经很久了,但是公司事情多,做着做着就忘记了.公司因为需要做接口,而且用的还是asp.net的老框架,使用Handler来做,没得办法,自己照着MVC写了一个通过的接口操作模板. 上送 ...
- 关于史考特证券(scottrade Inc)资金转出的手续费问题
投资美股账户的朋友可能开始的时候并没有关心史考特账户转出的费用,其实,仔细算一下这个费用还是蛮贵的,根据官网的文档可以明确知道,转出史考特账户资金到国内银行的费用由以下几项组成: 1. 国际电汇资金费 ...
- 一款非常推荐的用户界面插件----EasyUI
前 言 easyui是一种基于jQuery的用户界面插件集合. easyui为创建现代化,互动,JavaScript应用程序,提供必要的功能. 使用easyui你不需要写很多代码,你只需要 ...
- 轻松驾驭Tomcat
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选.对于一个初学者来说,可以这样 ...
- 40个Java多线程问题
1.多线程有什么用? 一个可能在很多人看来很扯淡的一个问题:我会用多线程就好了,还管它有什么用?在我看来,这个回答更扯淡.所谓”知其然知其所以然”,”会用”只是”知其然”,”为什么用”才是”知其所以然 ...
- 浅谈Android中的组播(多播)
组播使用UDP对一定范围内的地址发送相同的一组Packet,即一次可以向多个接受者发出信息,其与单播的主要区别是地址的形式.IP协议分配了一定范围的地址空间给多播(多播只能使用这个范围内的IP),IP ...
- shell全自动登录远程终端
先看效果 你需要做的事情,在配置文件中配置服务器信息,选择对应的服务器,进行连接. 传统手工连接 #密码方式 ssh user@ip # 然后输入服务器密码 #密钥登录 ssh -i identity ...
- 深度学习的异构加速技术(一):AI 需要一个多大的“心脏”?
欢迎大家前往腾讯云社区,获取更多腾讯海量技术实践干货哦~ 作者:kevinxiaoyu,高级研究员,隶属腾讯TEG-架构平台部,主要研究方向为深度学习异构计算与硬件加速.FPGA云.高速视觉感知等方向 ...
- 自学HTML5难 我们应该怎么做
互联网发展到今天,越来越多的技术岗位人才出现了稀缺的状态,就拿当前的HTML5来讲,基本成为了每家互联网公司不可缺少的人才.如果抓住这个机会,把HTML5搞好,那么前途不可限量,而且这门行业是越老越吃 ...
- [搜索]ElasticSearch Java Api(一) -添加数据创建索引
转载:http://blog.csdn.net/napoay/article/details/51707023 ElasticSearch JAVA API官网文档:https://www.elast ...