正则表达式常常用于匹配关键字,下面先介绍基本语法。

【基本语法】

①中括号表示满足其中之一即可,例如[abc],则这个位置可以是a、b、c中任意一个。

②在中括号中,可以通过-连接范围,例如a-z;多个范围之间并列不需要任何分隔符,例如[a-zA-Z]

③表示重复次数用{x},例如[a-z]{2}表示连续2次;表示重复次数的范围可用{x,y}。

④\\d表示数字。

⑤正则表达式默认的是贪婪匹配,例如[a-z]{2,4},如果出现类似abcde2ab这样的字符串,abcd满足最大长度4,因此会作为一个字符串、e是第二个、ab是第三个。

⑥通配符为.(点),.表示除换行符意外的任意字符。

⑦?表示0个或一个前面的字符、+代表至少一个、*代表0个或多个。

例如zo*,*代表o可以是0个或者多个o,也就是说可以是z、zoo。

⑧以什么开头用^,以什么结尾用$。

⑨OC字符串中的特殊字符用\转义。

例如[ ]是正则中的特殊表达式,\[是普通的'['字符,而OC中\有特殊含义,需要对\再转义,因此用\\[表示'['。

⑩表示中文的范围为 \\u4e00-\\u9fa5。

⑪多个匹配条件的并列用|。

匹配时一定要注意贪婪匹配的问题,否则可能会出错。

下面介绍OC自带的正则表达式对象。

【NSRegularExpression的使用】

首先创建对象,然后通过匹配模式得到NSTextCheckingResult数组,从中取出对象可以拿到匹配到的字符的范围。

下面的代码演示了从一个字符串中找出main和if的范围。

 NSString *code = @"mainjiaoififsiifnelsetifajomainiskkl";
NSString *pattern1 = @"main|if";
NSRegularExpression *regex = [[NSRegularExpression alloc] initWithPattern:pattern1 options:0 error:nil];
NSArray *results = [regex matchesInString:code options:0 range:NSMakeRange(0, code.length)];
for (NSTextCheckingResult *result in results) {
NSLog(@"%@",NSStringFromRange(result.range));
}

利用系统的对象进行匹配比较麻烦,下面介绍一个强大的第三方库RegexKitLite。

【集成RegexKitLite】

①首先从github下载RegexKitLite

②将文件RegexKitLite.m和.h导入到工程。

③由于该库比较老,不支持ARC,因此应该为RegexKitLite.m添加编译标记-fno-objc-arc进行局部ARC禁止。

④添加动态库libicucore.dylib。

注意③和④都在Build Phases中进行设置,如下图所示:

通过以上几步就完成了集成,下面介绍该库的常用方法。

该库是NSString的分类,因此字符串可以直接调用方法,常用的方法有匹配和分割。

①匹配:传入匹配模式pattern即可,可以获取匹配到的字符串和范围。

[str enumerateStringsMatchedByRegex:pattern usingBlock:^(NSInteger captureCount, NSString *const __unsafe_unretained *capturedStrings, const NSRange *capturedRanges, volatile BOOL *const stop) {

     NSRange range = *capturedRanges;
NSLog(@"%@ %@",*capturedStrings,NSStringFromRange(range)); }];

②分割:有时候有一种需求,需要获取到所有匹配到的内容之外的字串,也就是利用正则内容分割字符串,可以得到匹配到的字串以外的字符串和范围。

[str enumerateStringsSeparatedByRegex:pattern usingBlock:^(NSInteger captureCount, NSString *const __unsafe_unretained *capturedStrings, const NSRange *capturedRanges, volatile BOOL *const stop) {

     NSRange range = *capturedRanges;
NSLog(@"%@ %@",*capturedStrings,NSStringFromRange(range)); }];

(一一〇)正则表达式的基本使用与RegexKitLite的使用的更多相关文章

  1. (一一〇)正則表達式的基本使用与RegexKitLite的使用

    正則表達式经常常使用于匹配keyword,以下先介绍基本的语法. [基本的语法] ①中括号表示满足当中之中的一个就可以,比如[abc],则这个位置能够是a.b.c中随意一个. ②在中括号里,能够通过- ...

  2. iOS-常用的第三方框架的介绍

    写iOS 程序的时候往往需要很多第三方框架的支持,可以大大减少工作量,讲重点放在软件本身的逻辑实现上. GitHub 里面有大量优秀的第三方框架,而且 License 对商业很友好.一下摘录一下几乎每 ...

  3. IOS一些高效的第三方框架库

    MBProgressHUD ——进展指示符库 苹果的应用程序一般都会用一种优雅的,半透明的进度显示效果,不过这个API是不公开的,因此你要是用了,很可能被清除出AppStore.而 MBProgres ...

  4. iphone 开源汇总(转)

    原文地址 http://blog.csdn.net/devday/article/details/6105793 扫描wifi信息: http://code.google.com/p/uwecaugm ...

  5. iOS开源项目汇总

    扫描wifi信息: http://code.google.com/p/uwecaugmentedrealityproject/ http://code.google.com/p/iphone-wire ...

  6. GitHub 里面有大量优秀的第三方框架

    写iOS 程序的时候往往需要很多第三方框架的支持,可以大大减少工作量,讲重点放在软件本身的逻辑实现上. GitHub 里面有大量优秀的第三方框架,而且 License 对商业很友好.一下摘录一下几乎每 ...

  7. ios开源项目(各种有用的第三方库)

    状态栏:MTStatusBarOverlay  下拉刷新:EGOTableViewPullRefresh  网络应用:ASIHTTPRequest  等待特效:MBProgressHUD  JSON解 ...

  8. 需要知道的开源的框架-IOS

    1:SDWebImage,UIImageView+WebCache加载一张图片. 2:UIViewExt用于定位坐标很有用,可以直接拿到bottom,top,left,right. 转:http:// ...

  9. iOS常用的开源类库

    开发几个常用的开源类库及下载地址: 引用 1.json json编码解码 2.GTMBase64 base64编码解码 3.TouchXML xml解析 4.SFHFKeychainUtils 安全保 ...

随机推荐

  1. [bzoj4755][Jsoi2016]扭动的回文串

    来自FallDream的博客,未经允许,请勿转载,谢谢. JYY有两个长度均为N的字符串A和B. 一个“扭动字符串S(i,j,k)由A中的第i个字符到第j个字符组成的子串与B中的第j个字符到第k个字符 ...

  2. bzoj 1974: [Sdoi2010]代码拍卖会

    Description 随着iPig在P++语言上的造诣日益提升,他形成了自己一套完整的代 码库.猪王国想参加POI的童鞋们都争先恐后问iPig索要代码库.iPi g不想把代码库给所有想要的小猪,只想 ...

  3. bzoj1911[Apio2010]特别行动队 斜率优化dp

    1911: [Apio2010]特别行动队 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 5057  Solved: 2492[Submit][Statu ...

  4. bzoj3173[Tjoi2013]最长上升子序列 平衡树+lis

    3173: [Tjoi2013]最长上升子序列 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2253  Solved: 1136[Submit][S ...

  5. 谷歌开发者:看可口可乐公司是怎么玩转TensorFlow的?

    在这篇客座文章中,可口可乐公司的 Patrick Brandt 将向我们介绍他们如何使用 AI 和 TensorFlow 实现无缝式购买凭证. 可口可乐的核心忠诚度计划于 2006 年以 MyCoke ...

  6. A TensorBoard plugin for visualizing arbitrary tensors in a video as your network trains.Beholder是一个TensorBoard插件,用于在模型训练时查看视频帧。

    Beholder is a TensorBoard plugin for viewing frames of a video while your model trains. It comes wit ...

  7. C++中的各种可调用对象

    概述 一组执行任务的语句都可以视为一个函数,一个可调用对象.在程序设计的过程中,我们习惯于把那些具有复用性的一组语句抽象为函数,把变化的部分抽象为函数的参数. 函数的使用能够极大的极少代码重复率,提高 ...

  8. 荣耀10带来AI版WPS,玩转潮酷新功能

    图书馆里,想把喜欢的句子和情节留存, 无奈摘抄需要时间,拍下来又很容易遗忘在相册? 课堂偷偷拍摄的课件, 模糊一片难以辨认? 开会培训收集的PPT照片, 总有那么几页对焦失败? 这些当时起劲,后来就& ...

  9. Vim8.0在Debian下,normal模式的O命令出现延时

    Update 2018/4/26 问题是什么 在Debian的Vim8.0中,normal模式下,使用O创建新行,常常出现延迟情况:按下O后,可以看见O首先在当前光标位置出现,过了大约0.5-1秒,接 ...

  10. JAVA 第二天 关键字

    一.标识符及字符集 Java语言规定标识符是以字母.下划线"_"或美元符号"$"开始,随后可跟数字.字母.下划线或美元符号的字符序列.Java标识符大小写敏感, ...