iOS 正則表達式

正則表達式,又称正规表示法、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE)。计算机科学的一个概念。

正則表達式使用单个字符串来描写叙述、匹配一系列符合某个句法规则的字符串。在非常多文本编辑器里。正則表達式通常被用来检索、替换那些符合某个模式的文本。

  1. 系统自带的, 如: NSPredicate, rangeOfString:option, NSRegularExpression
  2. RegexKitLite RegexKitLite 是一个轻量级的 Objective-C 的正則表達式库,支持 Mac OS X 和 iOS,使用 ICU 库开发。

至于RegexKitLite, 这里不做介绍。着重介绍系统自带的那几个办法。

PS: 阅读本文前提是您已经掌握了正则基本的语法, 假设对正则还不太了解, 能够參考以下几个链接:

正則表達式学习链接:

  1. 55分钟学会正則表達式
  2. 揭开正則表達式的神奇面纱
  3. RegExLib.com(正則表達式库查询)

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_正則表達式的更多相关文章

  1. js正則表達式语法

    1. 正則表達式规则 1.1 普通字符 字母.数字.汉字.下划线.以及后边章节中没有特殊定义的标点符号,都是"普通字符".表达式中的普通字符,在匹配一个字符串的时候,匹配与之同样的 ...

  2. Java正則表達式入门

     众所周知,在程序开发中,难免会遇到须要匹配.查找.替换.推断字符串的情况发生,而这些情况有时又比較复杂,假设用纯编码方式解决,往往会浪费程序猿的时间及精力.因此,学习及使用正則表達式,便成了解决这一 ...

  3. jquery+正則表達式验证邮箱格式的样例

    js: $("#email").blur(function(){ //获取id相应的元素的值,去掉其左右的空格 var email = $.trim($('#email').val ...

  4. python使用正則表達式

    python中使用正則表達式 1. 匹配字符 正則表達式中的元字符有 .  ^  $ *   +  ?  { }  [ ]  \  | ( ) 匹配字符用的模式有 \d 匹配随意数字 \D 匹配随意非 ...

  5. Java正則表達式语法

    Java正則表達式语法 字符 说明 \ 将下一字符标记为特殊字符.文本.反向引用或八进制转义符.比如,"n"匹配字符"n"."\n"匹配换行 ...

  6. javascript正則表達式 &quot;\b&quot;问题

    preface 昨晚在看<javascript权威指南>后.看见作者自己封装一个兼容全部浏览器的山寨HTML5新API classLIst类.自己想了想认为自己也要去玩一下.可是能力还是有 ...

  7. C++11中正則表達式測试

    VC++2010已经支持regex了, 能够用来编译下述代码. #include <string> #include <regex> #include <iostream ...

  8. 深入浅出理解iOS经常使用的正則表達式—基础篇[Foundation]

    參考资料:cocoachina的zys475481075的文章 几个单词 Regular ['regjʊlə]adj. 定期的:有规律的 Expression[ɪk'spreʃ(ə)n; ek-] n ...

  9. Linux正則表達式-反复出现的字符

    星号(*)元字符表示它前面的正則表達式能够出现零次或多次.也就是说,假设它改动了单个字符.那么该字符能够在那里也能够不在那里,而且假设它在那里,那可能会不止出现一个.能够使用星号元字符匹配出如今引號中 ...

随机推荐

  1. 结合GET(),POST()实现一个简单、完整的服务器

    复习一下: 基础模块 作用 fs fs模块用于对系统文件及目录进行读写操作 http 创建服务器.e.g.http.createServer(); queryString 把url带的参数串转化为数组 ...

  2. Python——网络爬虫

    此篇文章继续跟着小甲鱼的视频来初学网络爬虫,除了小甲鱼的网站上可下载视频,发现b站上也有全套的视频哦,会比下载来的更方便些. 网络爬虫,又称为网页蜘蛛(WebSpider),非常形象的一个名字.如果你 ...

  3. R语言高性能编程(三)

    一.使用并行计算加倍提升性能1.数据并行 VS 任务并行实现数据并行的算法scoket 并行性注意并行计算时间并不与执行任务的计算资源数目成正比(计算机核心),amdahl定律:并行代码的速度受限于串 ...

  4. [转载] TCP长连接与短连接的区别

    转载自http://www.cnblogs.com/liuyong/archive/2011/07/01/2095487.html 1. TCP连接 当网络通信时采用TCP协议时,在真正的读写操作之前 ...

  5. 设计模式的征途—7.适配器(Adapter)模式

    在现实生活中,我们的笔记本电脑的工作电压大多数都是20V,而我国的家庭用电是220V,如何让20V的笔记本电脑能够工作在220V的电压下工作?答案:引入一个电源适配器,俗称变压器,有了这个电源适配器, ...

  6. 【S2-052】漏洞复现(CVE-2017-9805)

    一.漏洞描述 Struts2 的REST插件,如果带有XStream组件,那么在进行反序列化XML请求时,存在未对数据内容进行有效验证的安全隐患,可能发生远程命令执行. 二.受影响版本 Struts2 ...

  7. FPGA FIFO深度计算

    转自:http://comm.chinaaet.com/adi/blogdetail/37555.html 首先,一定要理解清楚FIFO的应用场景,这个会直接关系到FIFO深度的计算,如果是面试官抛出 ...

  8. iOS学习——如何在mac上获取开发使用的模拟器的资源以及模拟器中每个应用的应用沙盒

    如题,本文主要研究如何在mac上获取开发使用的模拟器的资源以及模拟器中每个应用的应用沙盒.做过安卓开发的小伙伴肯定很方便就能像打开资源管理器一样查看我们写到手机本地或应用中的各种资源,但是在iOS开发 ...

  9. python从2.7升级到3.5 需要主要的问题

    今天鼓足勇气把我们python从2.7升级到3.5.我用的是pycharm开发工具.升级过程遇到一些问题小结下: 1.右击项目: 找到左侧 project interpreter选项,配置项目开发环境 ...

  10. Less的嵌套规则

    Less的嵌套规则 在使用标准CSS时,要为多层嵌套的元素定义样式,要么使用后代选择器从外到内的嵌套定义,要么给这个元素加上类名或 id 来定义.这样的写法虽然很好理解,但维护起来很不方便,因为无法清 ...