iOS 正則表達式

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

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

正則表達式学习链接:

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

1. NSPredicate

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.

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.

针对以上3种方式, 做一个小小总结

经常使用正則表達式

參考: 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地址
05-11 20:13