所见即得的正则表达式

一般开发中,时不时需要用到正则表达式。然而不像 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/ 等类似网站上先测试你的表达式,然后直接拿来用而无需转义。

注意:此宏生成的字符串不再是编译时的常量,而是运行时生成的,会有一定的性能损失