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. java注解(Annotation)

    本文转载自http://www.cnblogs.com/xdp-gacl/p/3622275.html 一.认识注解 注解(Annotation)很重要,未来的开发模式都是基于注解的,JPA是基于注解 ...

  2. centos6.7系统安装流程

    虚拟机创建centos的过程,如下: 1.首先创建一个空白文件 2.打开虚拟机,打开文件,或者页面的<创建虚拟机>,如下: 3.打开之后如下所示,选择自定义,Linux崇尚自由 4.第四步 ...

  3. bash, sh, dash 傻傻分不清楚

    原文链接,转载请注明出处: http://www.happycxz.com/m/?p=137 常见shell类型 Bourne shell (sh) UNIX 最初使用,且在每种 UNIX 上都可以使 ...

  4. C# 自定义样式实现菜单和工具栏的分割线

    在做WinForm界面布局时,菜单和工具栏必不可少!但是MenuStrip和ToolStrip不能够对边框的样式直接设置,如果想实现菜单和工具栏之间的分割线就不容易实现:今天查阅了一下msdn找到了一 ...

  5. RabbitMQ的简单应用

    虽然后台使用了读写分离技术,能够在一定程度上抗击高并发,但是如果并发量特别巨大时,主数据库不能同时处理高并发的请求,这时数据库容易宕机. 问题: 现在的问题是如何既能保证数据库正常运行,又能实现用户数 ...

  6. JavaScript数据可视化编程学习(一)Flotr2,包含简单的,柱状图,折线图,饼图,散点图

    一.基础柱状图 二.基础的折线图 三.基础的饼图 四.基础的散点图 一.基础柱状图 如果你还没有想好你的数据用什么类型的图表来展示你的数据,你应该首先考虑是否可以做成柱状图.柱状图可以表示数据的变化过 ...

  7. ubuntu16.04安装交叉编译链

    我使用的是arm-linux-gcc 4.3.2版本,其他版本类似,附上下载链接: https://pan.baidu.com/s/1geUOfab 密码: frzy 首先我的安装包是tar.bz2的 ...

  8. npoi导入导出

    NPOI是指构建在POI 3.x版本之上的一个程序,NPOI可以在没有安装Office的情况下对Word或Excel文档进行读写操作. NPOI是一个开源的Java读写Excel.WORD等微软OLE ...

  9. PHP+Redis 实例【二】页面缓存 新玩法

    今天算是认识到博客园里的审查团队多内幕了,哈哈,贴个图玩下. 气死宝宝了. 进入主题! 今天就不写什么功能性的了,换下口味说下关于页面级的缓存,应该怎么做. 相信有很多小伙伴查了百度,甚至google ...

  10. 3721:和数-poj

    总时间限制:  1000ms 内存限制:  65536kB 描述 给定一个正整数序列,判断其中有多少个数,等于数列中其他两个数的和. 比如,对于数列1 2 3 4, 这个问题的答案就是2, 因为3 = ...