美文网首页Xcoder Tips
所见即得的正则表达式

所见即得的正则表达式

作者: rickytan | 来源:发表于2019-02-23 20:10 被阅读0次

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

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

    相关文章

      网友评论

        本文标题:所见即得的正则表达式

        本文链接:https://www.haomeiwen.com/subject/csxmyqtx.html