博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NSRegularExpression iOS自带的正则表达式
阅读量:5111 次
发布时间:2019-06-13

本文共 7043 字,大约阅读时间需要 23 分钟。

以前做验证邮箱,电话号码的时候通常用第三方的正则表达式或者NSPredicate(点这里查看以前的文章),在后期,苹果推出了自己的正则表达式来提供给开发者调用,很方便,功能也强大.      具体可以查看官方文档,包括如何书写进行匹配的正则表达式例子,这里我就不多加详述了,因为本人看那一堆符号好烦.....只好直接求助于谷歌了,下面只给出几个常用的.    #define KPhoneRegex  @"\\d{3}-\\d{8}|\\d{3}-\\d{7}|\\d{4}-\\d{8}|\\d{4}-\\d{7}|1+[358]+\\d{9}|\\d{8}|\\d{7}"    #define KWebRegex    @"((http[s]{0,1}|ftp)://[a-zA-Z0-9\\.\\-]+\\.([a-zA-Z]{2,4})(:\\d+)?(/[a-zA-Z0-9\\.\\-~!@#$%^&*+?:_/=<>]*)?)|(www.[a-zA-Z0-9\\.\\-]+\\.([a-zA-Z]{2,4})(:\\d+)?(/[a-zA-Z0-9\\.\\-~!@#$%^&*+?:_/=<>]*)?)"    #define KWebOtherRegex @"http+:[^\\s]*"    #define KEmailRegex  @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"    /**         1. 返回所有匹配结果的集合(适合,从一段字符串中提取我们想要匹配的所有数据)         *  - (NSArray *)matchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;         2. 返回正确匹配的个数(通过等于0,来验证邮箱,电话什么的,代替NSPredicate)         *  - (NSUInteger)numberOfMatchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;         3. 返回第一个匹配的结果。注意,匹配的结果保存在  NSTextCheckingResult 类型中         *  - (NSTextCheckingResult *)firstMatchInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;         4. 返回第一个正确匹配结果字符串的NSRange         *  - (NSRange)rangeOfFirstMatchInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;         5. block方法         *  - (void)enumerateMatchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range usingBlock:(void (^)(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop))block;         */                /**         *  enum {         NSRegularExpressionCaseInsensitive             = 1 << 0,   // 不区分大小写的         NSRegularExpressionAllowCommentsAndWhitespace  = 1 << 1,   // 忽略空格和# -         NSRegularExpressionIgnoreMetacharacters        = 1 << 2,   // 整体化         NSRegularExpressionDotMatchesLineSeparators    = 1 << 3,   // 匹配任何字符,包括行分隔符         NSRegularExpressionAnchorsMatchLines           = 1 << 4,   // 允许^和$在匹配的开始和结束行         NSRegularExpressionUseUnixLineSeparators       = 1 << 5,   // (查找范围为整个的话无效)         NSRegularExpressionUseUnicodeWordBoundaries    = 1 << 6    // (查找范围为整个的话无效)         };         typedef NSUInteger NSRegularExpressionOptions;         */                // 下面2个枚举貌似都没什么意义,除了在block方法中,一般情况下,直接给0吧        /**         *  enum {         NSMatchingReportProgress         = 1 << 0,         NSMatchingReportCompletion       = 1 << 1,         NSMatchingAnchored               = 1 << 2,         NSMatchingWithTransparentBounds  = 1 << 3,         NSMatchingWithoutAnchoringBounds = 1 << 4         };         typedef NSUInteger NSMatchingOptions;         */                /** 此枚举值只在5.block方法中用到         *  enum {         NSMatchingProgress               = 1 << 0,         NSMatchingCompleted              = 1 << 1,         NSMatchingHitEnd                 = 1 << 2,         NSMatchingRequiredEnd            = 1 << 3,         NSMatchingInternalError          = 1 << 4         };         typedef NSUInteger NSMatchingFlags;         */                     // 测试字符串,把里面的电话号码解析出来        NSString *urlString = @"哈哈哈哈呵呵呵s15279107723在这里啊啊啊啊s15279107716";        NSError *error = NULL;        // 根据匹配条件,创建了一个正则表达式(类方法,实例方法类似)        NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:KPhoneRegex options:NSRegularExpressionCaseInsensitive error:&error];        if (regex != nil) {            // 3.....            NSTextCheckingResult *firstMatch = [regex firstMatchInString:urlString                                                                 options:0                                                                range:NSMakeRange(0, [urlString length])];            if (firstMatch) {                NSRange resultRange = [firstMatch rangeAtIndex:0];                //从urlString中截取数据                NSString *result = [urlString substringWithRange:resultRange];                NSLog(@"result = %@",result);            }            // 2.....            NSUInteger number = [regex numberOfMatchesInString:urlString                                                       options:0                                                       range:NSMakeRange(0, [urlString length])];            NSLog(@"number = %ld",number);            // 5.....(坑爹的返回第一个匹配结果)            [regex enumerateMatchesInString:urlString options:0 range:NSMakeRange(0, [urlString length]) usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {                NSLog(@"---%@",NSStringFromRange([result range]));                if (flags != NSMatchingInternalError) {                    NSRange firstHalfRange = [result rangeAtIndex:0];                    if (firstHalfRange.length > 0) {                        NSString *resultString1 = [urlString substringWithRange:firstHalfRange];                        NSLog(@"result1 = %@",resultString1);                    }                }                *stop = YES;            }];        }                // 替换掉你要匹配的字符串        NSString *reString = [regex stringByReplacingMatchesInString:urlString                                                            options:0                                                            range:NSMakeRange(0, [urlString length])                                                            withTemplate:@"(我就是替换的值)"];        NSLog(@"reString = %@",reString);        // 还有2个方法大家可以去尝试看看                        // 1.        NSMutableArray *oneArray = [self _matchLinkWithStr:urlString withMatchStr:KPhoneRegex];        for (NSString *phone in oneArray) {            NSLog(@"phone = %@",phone);        }    // 1.....    - (NSMutableArray *)_matchLinkWithStr:(NSString *)str withMatchStr:(NSString *)matchRegex;    {        NSError *error = NULL;        NSRegularExpression *reg = [NSRegularExpression regularExpressionWithPattern:matchRegex                                                                             options:NSRegularExpressionCaseInsensitive                                                                               error:&error];        NSArray *match = [reg matchesInString:str                                      options:NSMatchingReportCompletion                                      range:NSMakeRange(0, [str length])];                NSMutableArray *rangeArr = [NSMutableArray array];        // 取得所有的NSRange对象        if(match.count != 0)        {            for (NSTextCheckingResult *matc in match)            {                NSRange range = [matc range];                NSValue *value = [NSValue valueWithRange:range];                [rangeArr addObject:value];            }        }        // 将要匹配的值取出来,存入数组当中        __block NSMutableArray *mulArr = [NSMutableArray array];        [rangeArr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {            NSValue *value = (NSValue *)obj;            NSRange range = [value rangeValue];            [mulArr addObject:[str substringWithRange:range]];        }];        return mulArr;    }

@结果:

转载于:https://www.cnblogs.com/Free-Thinker/p/9555666.html

你可能感兴趣的文章
tmux的简单快捷键
查看>>
[Swift]LeetCode922.按奇偶排序数组 II | Sort Array By Parity II
查看>>
Html5 离线页面缓存
查看>>
《绿色·精简·性感·迷你版》易语言,小到不可想象
查看>>
Android打包key密码丢失找回
查看>>
VC6.0调试技巧(一)(转)
查看>>
类库与框架,强类型与弱类型的闲聊
查看>>
webView添加头视图
查看>>
php match_model的简单使用
查看>>
在NT中直接访问物理内存
查看>>
Intel HEX 文件格式
查看>>
SIP服务器性能测试工具SIPp使用指导(转)
查看>>
回调没用,加上iframe提交表单
查看>>
(安卓)一般安卓开始界面 Loding 跳转 实例 ---亲测!
查看>>
Mysql 索引优化 - 1
查看>>
LeetCode(3) || Median of Two Sorted Arrays
查看>>
大话文本检测经典模型:EAST
查看>>
待整理
查看>>
一次动态sql查询订单数据的设计
查看>>
C# 类(10) 抽象类.
查看>>