一般开发中,时不时需要用到正则表达式。然而不像 JavaScript 等语言一样有方便的原生支持,在 Objective-C 等语言中需要用字符串来生成正则表达式对象,而做为字符串字面量,它免不了需要转义。
JavaScript 版本
var reg = /^1\d{10}$/; // 判断中国大陆手机号
Objective-C 版本
NSNSRegularExpression *reg = [NSRegularExpression regularExpressionWithPattern:@"^1\\d{10}$"
options:0
error:NULL];
这里匹配数字就要两个 \
了,成为 \\d
。如果再复杂一点,写起来就要特别小心了。
为解决此问题,特做了一个宏要实现所见即所得的正则表达式:
#ifndef REGEXP
# define _regexp_stringify(x) #x
# define _regexp_stringify2(x) _regexp_stringify(x)
# define _regexp(...) ({ const char *str = _regexp_stringify2(# __VA_ARGS__); const size_t length = strlen(str); [[NSString alloc] initWithBytes:str + 1 length:length - 2 encoding:NSUTF8StringEncoding]; })
# define REGEXP(...) [NSRegularExpression regularExpressionWithPattern:_regexp(__VA_ARGS__) options:0 error:NULL]
#endif
上面的 Objective-C 版本可以改为:
NSNSRegularExpression *reg = REGEXP(^1\d{10}$);
与 JavaScript 的写法基本一致了,你可以在 http://regexr.com/ 等类似网站上先测试你的表达式,然后直接拿来用而无需转义。
注意:此宏生成的字符串不再是编译时的常量,而是运行时生成的,会有一定的性能损失