一般開發(fā)中纠脾,時(shí)不時(shí)需要用到正則表達(dá)式。然而不像 JavaScript 等語言一樣有方便的原生支持蜕青,在 Objective-C 等語言中需要用字符串來生成正則表達(dá)式對(duì)象苟蹈,而做為字符串字面量,它免不了需要轉(zhuǎn)義右核。
JavaScript 版本
var reg = /^1\d{10}$/; // 判斷中國(guó)大陸手機(jī)號(hào)
Objective-C 版本
NSNSRegularExpression *reg = [NSRegularExpression regularExpressionWithPattern:@"^1\\d{10}$"
options:0
error:NULL];
這里匹配數(shù)字就要兩個(gè) \
了慧脱,成為 \\d
。如果再?gòu)?fù)雜一點(diǎn)贺喝,寫起來就要特別小心了磷瘤。
為解決此問題,特做了一個(gè)宏要實(shí)現(xiàn)所見即所得的正則表達(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/ 等類似網(wǎng)站上先測(cè)試你的表達(dá)式采缚,然后直接拿來用而無需轉(zhuǎn)義。
注意:此宏生成的字符串不再是編譯時(shí)的常量挠他,而是運(yùn)行時(shí)生成的扳抽,會(huì)有一定的性能損失