1、推荐下载iOS中正则表达式的基本使用方法iOS 中正则表达式的基本使用方法一.第三方框架 RegexKitLite 的使用 在 ios 项目中可以借用第三方框架 RegexKitLite 来简化对正则表达式的使用,使用方法如下1.去 RegexKitLite 下载类库,解压出来会有一个例子包及 2 个文件,将那两个文件添加到工程中,并导入到项目中。 下载地址:cocoachina/bbs/job.php?action-download-pid-135286-tid-18111-aid-11143.html - Lv2.工程中添加 libicucore.dylib frameworks。下面就是
2、使用介绍(可拷贝到 Xcode 中观看会很方便)- (void)howToUseRegexKitLite NSString *searchString = ”我正在#话题#吃饭zhangsan 你lisi 吃了没?”; NSString *regexString = ”w+”; / 返回所有匹配成功的结果,并存放到一个数组里 NSArray *array = searchString componentsMatchedByRegex:regexString; NSLog(”array:%”,array); / 输出结果: (“zhangsan”,”lisi”) / 透过传入一个 Regex 进
3、行字符串的比对,并且会将第一组比对出来的结果以NSArray 回传群组 NSArray *array1 = searchString captureComponentsMatchedByRegex:regexString; NSLog(”array1:%”,array1); / 输出结果: (“zhangsan”) / 同上者,一样会回传 Regex 所比对出来的字符串群组,但会回传全部的配对组合 NSArray *array2 = searchStringarrayOfCaptureComponentsMatchedByRegex:regexString; NSLog(”array2:%”,
4、array2); / 输出结果: (“zhangsan”),(“lisi”) / 判断字符串是否与 Regex 配对 BOOL isMatched = ”zhangsan” isMatchedByRegex:regexString; if (isMatched) NSLog(”配对成功”); / 取得配对出来的第一個完整字串 NSString *matchedString1 = searchString stringByMatching:regexString; NSLog(”matchedString1:%”,matchedString1); / 输出结果: zhangsan / 将字符串中
5、与 Regex 配对的结果进行替换 NSString *replaceString = ”wangwu”; NSString *matchedString2 = searchStringstringByReplacingOccurrencesOfRegex:regexString withString:replaceString; NSLog(”matchedString2:%”,matchedString2); / 输出结果: 我正在#话题#吃饭 wangwu 你 wangwu 吃了没? / 如果是 NSMutableString,则可以直接替换,并返回替换的次数 NSMutableStri
6、ng *mutSearchString = NSMutableString stringWithString:”我正在#话题#吃放zhangsan 你lisi 吃了没?”; NSInteger mutMatchedString2 = mutSearchStringreplaceOccurrencesOfRegex:regexString withString:replaceString; NSLog(”mutMatchedString2:%ld”,mutMatchedString2); / 输出结果: 2 / 返回一个拆分后的字符串数组 NSArray *array3 = searchStri
7、ng componentsSeparatedByRegex:regexString; NSLog(”array3:%”,array3); / 输出结果: (“我正在#话题#吃饭”,” 你”,” 吃了没?”)#pragma mark RegexKitLite 的使用总结/*RegexKitLite 提供的方法都是透过 NSString 来操作,常用的方法:1. - (NSArray *)RKL_METHOD_PREPEND(componentsMatchedByRegex):(NSString*)regex返回所有匹配成功的结果,并存放到一个数组里2. - (NSArray *)captureC
8、omponentsMatchedByRegex:(NSString *)regex;这个方法是透过传入一个 Regex 进行字串的比对,并且会将第一组比对出来的结果以 NSArray 回传群组。3. - (NSArray *)arrayOfCaptureComponentsMatchedByRegex:(NSString *)regex;這個方法如同上者,一样会回传 Regex 所比对出来的字串群组,但会回传全部的配对组合。4. - (BOOL)isMatchedByRegex:(NSString *)regex;判断字串是否与 Regex 配对,在进行资料验证的時候很实用。5. - (NSS
9、tring *)stringByMatching:(NSString *)regex;这方法则是会回传配对出来的第一個完整字串。6. - (NSString *)stringByReplacingOccurrencesOfRegex:(NSString *)regexwithString:(NSString *)replacement;将字串中与 Regex 配对的结果进行替换。7. - (NSInteger)replaceOccurrencesOfRegex:(NSString *)regex withString:(NSString*)replacement如果是 NSMutableStr
10、ing,则可以直接替换,并返回替换的次数8. - (NSArray *)componentsSeparatedByRegex:(NSString *)regex用于拆分,返回一个拆分后的字符串数组*/二.正则表达式的使用- (void)howToUseRegex #pragma mark 1.正则表达式规则 /*-1.1 普通字符-*/ / 字母、数字、汉字、下划线、非特殊定义的标点符号,都是”普通字符”。表达式中的普通字符,在匹配一个字符串的时候,匹配与之相同的一个字符。 NSString *searchString1_1 = ”abcde”; NSString *regexString1_
11、1 = ”c”; NSString *matchedString1_1 = searchString1_1 stringByMatching:regexString1_1; NSLog(”matchedString1_1:%”,matchedString1_1); / 输出结果: c /*-1.2 简单的转义字符-*/ / 一些不便书写的字符,在前面加 “”,如:n,t, 等 NSString *searchString1_2 = ”abc$de”; / 记住在字符串中“”需要用“”表示 NSString *regexString1_2 = ”$d”; NSString *matchedStr
12、ing1_2 = searchString1_2 stringByMatching:regexString1_2; NSLog(”matchedString1_2:%”,matchedString1_2); / 输出结果: $d /*-1.3 能够与 多种字符 匹配的表达式-*/ /* . : 匹配除换行符以外的任意字符 w : 匹配字母或数字或下划线或汉字 s : 匹配任意的空白符 d : 匹配数字 b : 匹配单词的开始或结束 */ NSString *searchString1_3 = ”abc123”; / 正则表达式有一条规则:最先开始的匹配拥有最高的优先权 NSString *re
13、gexString1_3 = ”dd”; NSString *matchedString1_3 = searchString1_3 stringByMatching:regexString1_3; NSLog(”matchedString1_3:%”,matchedString1_3); / 输出结果: 12 /*-1.4 自定义能够匹配 多种字符 的表达式-*/tring1_4 = searchString1_4 stringByMatching:regexString1_4; NSLog(”matchedString1_4:%”,matchedString1_4); / 输出结果: bc
14、/*-1.5 修饰匹配次数的特殊符号-*/ / 使用表达式再加上修饰匹配次数的特殊符号,那么不用重复书写表达式就可以重复匹配 /* n : 表达式重复 n 次 m,n : 表达式至少重复 m 次,最多重复 n 次 m, : 表达式至少重复 m 次 ? : 匹配表达式 0 次或者 1 次,相当于 0,1 + : 表达式至少出现 1 次,相当于 1, * : 表达式不出现或出现任意次,相当于 0, */ NSString *searchString1_5 = ”It costs $12.5”; NSString *regexString1_5 = ”d+.?d”; NSString *matche
15、dString1_5 = searchString1_5 stringByMatching:regexString1_5; NSLog(”matchedString1_5:%”,matchedString1_5); / 输出结果: 12.5 /*-类似,本身不匹配任何字符,但是它要求它在匹配结果中所处位置的左右两边,其中一边是 “w” 范围,另一边是 非”w” 的范围 NSString *searchString1_6 = ”abc”; NSString *regexString1_6 = ”.b.”; NSString *matchedString1_6 = searchString1_6
16、stringByMatching:regexString1_6; NSLog(”matchedString1_6:%”,matchedString1_6); / 输出结果: a#pragma mark 2.正则表达式中的一些高级规则 /*-2.1 匹配次数中的贪婪与非贪婪-*/ / 1)在使用修饰匹配次数的特殊符号”m,n”, “m,”, “?”, “*”, “+”可以使同一个表达式能够匹配不同的次数,这种重复匹配不定次数的表达式在匹配过程中,总是尽可能多的匹配。如: NSString *searchString2_1_1 = ”dxxxdxxxd”; NSString *regexStrin
17、g2_1_1 = ”(d)(w+)(d)”; NSString *matchedString2_1_1 = searchString2_1_1stringByMatching:regexString2_1_1; NSLog(”matchedString2_1_1:%”,matchedString2_1_1); / 输出结果:dxxxdxxxd / 2)在修饰匹配次数的特殊符号后再加上一个 “?” 号,则可以使匹配次数不定的表达式尽可能少的匹配,这种匹配原则叫作 “非贪婪” 模式,也叫作 “勉强” 模式 NSString *regexString2_1_2 = ”(d)(w+?)(d)”; NS
18、String *matchedString2_1_2 = searchString2_1_1stringByMatching:regexString2_1_2; NSLog(”matchedString2_1_2:%”,matchedString2_1_2); / 输出结果: dxxxd /*-2.2 反向引用-*/ / 使用小括号指定一个子表达式后,匹配这个子表达式的文本(也就是此分组捕获的内容)可以在表达式或其它程序中作进一步的处理。默认情况下,每个分组会自动拥有一个组号,规则是:从左向右,以分组的左括号为标志,第一个出现的分组的组号为 1,第二个为 2,以此类推 NSString *se
19、archString2_2 = ”go go”; NSString *regexString2_2 = ”b(w+)bs+1b”; NSString *matchedString2_2 = searchString2_2 stringByMatching:regexString2_2; * 1)捕获 (exp) : 匹配 exp,并捕获文本到自动命名的组里 (? name exp) : 匹配 exp,并捕获文本到名称为 name 的组里,也可以写成(?nameexp) (?:exp) : 匹配 exp,不捕获匹配的文本,也不给此分组分配组号零宽断言,可节约性能,提高效率 2)零宽断言 (?=e
20、xp) : 匹配 exp 前面的位置 (? =exp) : 匹配 exp 后面的位置 (?!exp) : 匹配后面跟的不是 exp 的位置 (? !exp) : 匹配前面不是 exp 的位置注释(?#comment)这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读 */ NSString *searchString2_3 = ”Im singing while youre dancing.”; NSString *regexString2_3 = ”bw+(?=ingb)”; NSArray *matchedString2_3 = searchString2_3compon
21、entsMatchedByRegex:regexString2_3; NSLog(”matchedString2_3:%”,matchedString2_3); / 输出结果: (sing,danc) / 3.其他通用规则 /*-3.1-*/ / 表达式中,可以使用 “xXX” 和 “uXXXX” 表示一个字符(”X” 表示一个十六进制数) /* xXX : 编号在 0 255 范围的字符,比如:空格可以使用 “x20” 表示 uXXXX : 任何字符可以使用 “u” 再加上其编号的 4 位十六进制数表示,比如:”u4E2D” ? : 修饰匹配次数为 0 次或 1 次。要匹配 “?” 字符本身
22、,请使用 “?” + : 修饰匹配次数为至少 1 次。要匹配 “+” 字符本身,请使用 “+” * : 修饰匹配次数为 0 次或任意次。要匹配 “*” 字符本身,请使用 “*” | : 左右两边表达式之间 “或” 关系。匹配 “|” 本身,请使用 “|” “ : 用在不带的字符串中时,用”来进行转义,用在带的字符串中时,用”“来进行转义讯 QQ 号:1-90-94, (腾讯 QQ 号从 10000 开始)32 中国邮政编码:1-9d5(?!d) (中国邮政编码为 6 位数字)33 IP 地址:d+.d+.d+.d+ (提取 IP 地址时有用)附录二 : 参考资料正则表达式检测工具:regexlab/zh/workshop.htm tool.oschina/regex参考文档: regexlab/zh/regref.htm deerchao/tutorials/regex/regex.htm lxcnnblogs/tips:感谢大家的阅读,本文由我司收集整编。仅供参阅!
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1