前言:

编程中,对于字符串的处理是无处不在的.时常需要在一堆乱码中找到有用的信息.比如在如下的字符串中获取有效的 URLEmail

ababsdbasbdabdhttp://baidu.com
<div>test@test.com<div>

诸如此类问题,我们都可以通过正则表达式来解决,正则在任意编程语言都有对应实现.

iOS4 之后,Cocoa 也提供了用于正则的 NSRegularExpressionNSTextCheckingResult 这两个类. 前者用于创建正则,匹配,替换;后者是一个快速匹配对象,可用于检查拼写,URL等,也可作为正则匹配的结果,包含匹配到子串所在 range 和匹配规则.

创建:

NSRegularExpression * regex = [NSRegularExpression regularExpressionWithPattern:@"http[s]?://[A-z0-9.-]*"
options:NSRegularExpressionCaseInsensitive error:nil];

正则匹配模式

  • [] 表示集合,
  • * 表示 出现零次或多次,
  • ? 表示出现零次或一次,
  • http[s]?://[A-z0-9.-]* ,即匹配以 http:// 或 https:// 开头,含有零或多个字母 - . 的字符串

option

  • NSRegularExpressionCaseInsensitive //忽略大小写
  • NSRegularExpressionAllowCommentsAndWhitespace //忽略空格,回车,tab,注释
  • NSRegularExpressionIgnoreMetacharacters //忽略 Meta
  • NSRegularExpressionDotMatchesLineSeparators //允许使用 . 通配任何符号,包括换行符
  • NSRegularExpressionAnchorsMatchLines //允许使用 ^ $匹配行头和行尾
  • NSRegularExpressionUseUnixLineSeparators //只把 \n 当做换行符
  • NSRegularExpressionUseUnicodeWordBoundaries

应用:

NSRegularExpression 提供了对字符串 匹配 , 替换 的函数,

NSRegularExpression (NSMatching)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
	//枚举在 string 的指定 range 中按 pattern 匹配到的所有子字符串,在 block 中做处理
	- (void)enumerateMatchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range usingBlock:(void (^)(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop))block;
	//获取在 string 的指定 range 中按 pattern 匹配到的所有子字符串
	- (NSArray *)matchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;
	//获取匹配到子串的个数
	- (NSUInteger)numberOfMatchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;
	//获取第一次匹配到的结果,
	- (NSTextCheckingResult *)firstMatchInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;
	//获取第一次匹配到的 range
	- (NSRange)rangeOfFirstMatchInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;

NSRegularExpression (NSReplacement)

//修改在 string 的指定 range 中按 pattern 匹配到的子字符串为 templ, 将修改后的字符串深 copy 后返回
- (NSString *)stringByReplacingMatchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range withTemplate:(NSString *)templ;
//修改在 可变 string 的指定 range 中按 pattern 匹配到的子字符串为 templ, 并返回所修改的子串的个数
- (NSUInteger)replaceMatchesInString:(NSMutableString *)string options:(NSMatchingOptions)options range:(NSRange)range withTemplate:(NSString *)templ;

匹配示例

NSMutableString * str = [@"ababsdbasbdabdhttp://baidu.com" mutableCopy];
NSRegularExpression * regex = [NSRegularExpression regularExpressionWithPattern:@"http[s]?://[A-z0-9.]*" options:NSRegularExpressionCaseInsensitive error:nil];
NSTextCheckingResult * r =[regex firstMatchInString:str options:NSMatchingReportCompletion range:NSMakeRange(0, str.length)];
NSLog(@"%@",[str substringWithRange:r.range]);
输出:
2014-05-29 11:27:05.426 RegexDemo[49294:303] http://baid-u1.com

参考:

http://userguide.icu-project.org/strings/regexp https://developer.apple.com/library/mac/documentation/Foundation/Reference/NSRegularExpression_Class/Reference/Reference.html