NSRegularExpression iOS自带的正则表达式

以前做验证邮箱,电话号码的时候通常用第三方的正则表达式或者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\\.\\[email protected]#$%^&*+?:_/=<>]*)?)|(www.[a-zA-Z0-9\\.\\-]+\\.([a-zA-Z]{2,4})(:\\d+)?(/[a-zA-Z0-9\\.\\[email protected]#$%^&*+?:_/=<>]*)?)"
#define KWebOtherRegex @"http+:[^\\s]*"
#define KEmailRegex  @"[A-Z0-9a-z._%+-][email protected][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;
}

@结果:

时间: 2024-07-30 05:40:10

NSRegularExpression iOS自带的正则表达式的相关文章

iOS 自带定位功能

第一步:导入头文件 #import <CoreLocation/CoreLocation.h> #import <CoreLocation/CLLocationManagerDelegate.h> 第二步:设置代理 CLLocationManagerDelegate 第三步:创建一个属性 @property(nonatomic, strong) CLLocationManager *locationManager; 第四步:初始化     //定位服务管理对象初始化     _lo

ios 自带xml 解析,TBXMLParser解析

今天看了下苹果xml 解析,写了个小demo 心想还是 在博客上写点东西吧,毕竟很久很久都没有上来了 先上个效果图把 接下来 看下 工程目录图吧 本demo 分两种解析模式,一是苹果自带的, 首先先看下苹果自带的吧,工程文件为 NoteXMLParser 文件 ,另一种解析模式 是 NotesTBXMLParser文件 NoteXMLParser.h 文件代码如下 : // // NoteXMLParser.h // TestXML // // Created by choni on 14-5-

iOS 自带刷新功能

这里只介绍UIRefreshControl的使用方法,虽然EGO已经用得挺舒服的了,但是官方给的.毕竟还是蛮简单的 ================================================== UIRefreshControl 具有一个默认的高度和宽度 一旦创建,便自动管理.只有当用户用力刷新才能刷新,尤其...那朵菊花,用力越大,转速越快,感觉还不错哦.(瞬间...邪恶了) 下面介绍一下如何使用:     self.refreshControl = [[UIRefres

IOS自带输入法中文不触发KEYUP事件导致vue双向绑定错误问题

先上图: 可以看到输入框中的内容和弹出框的内容不一致, <input class="am-fr labRight" id="txcode" type="text" placeholder="请输入纳税人识别号" v-model="invBuyer.TaxCode" /> 文本框使用的是vue的v-model双向绑定,在android中是ok的,在IOS上不行, 导致问题出现的原因是IOS自带输入

iOS自带TTS技术的实现即语音播报

文本转语音技术, 也叫TTS, 是Text To Speech的缩写. iOS如果想做有声书等功能的时候, 会用到这门技术. 一,使用iOS自带TTS需要注意的几点: iOS7之后才有该功能 需要 AVFoundation 库 AVSpeechSynthesizer: 语音合成器, 可以假想成一个可以说话的人, 是最主要的接口 AVSpeechSynthesisVoice: 可以假想成人的声音 AVSpeechUtterance: 可以假想成要说的一段话 二,代码示例, 播放语音 //语音播报

新浪微博项目---首页技术点三.上拉刷新,下拉加载的实现(使用ios自带的小菊花实现)

一.上拉刷新,下拉加载的实现(使用ios自带的小菊花实现) 1.下拉刷新 #pragma mark ---集成下*拉刷新控件 -(void)setupDownRefresh { //1.添加刷新控件 UIRefreshControl *control = [[UIRefreshControl alloc] init]; //只有用户通过手动下拉刷新,才会触发UIControlEventValueChanged事件 [control addTarget:self action:@selector(

最简单的基于FFmpeg的移动端例子附件:IOS自带播放器

前几篇文章记录的都是IOS下基于FFmpeg的多媒体程序.本文记录一个IOS下自带的视频播放器.相比于移植FFmpeg来说,IOS自带的多媒体框架播放视频要简单很多--只需要调用几个接口就可以了. 源代码 项目的源代码位于ViewController.m文件中,内容如下所示. /** * 最简单的IOS视频播放器 * Simplest IOS Player * * 雷霄骅 Lei Xiaohua * [email protected] * 中国传媒大学/数字电视技术 * Communicatio

iOS 自带地图定位失败原因 Code=0和Code=1区别

1:没有选择位置 Error Domain=kCLErrorDomain Code=0 "The operation couldn't be completed. (kCLErrorDomain error 0.)" 解决方案: 2:软件没有获得定位许可 Error Domain=kCLErrorDomain Code=1 "The operation couldn't be completed. (kCLErrorDomain error 1.)" 解决方案: i

即时搜索:对于ios自带输入法输入中文时多次触发input事件的处理

实现移动端的即时搜索的最佳方案,一定是使用input propertychange事件了,但是在ios设备上遇到了问题,使用ios自带输入法输入汉字时,会出现多次触发input事件的情况,一开始可能由于搜索的关键字不得法,没有即时找到合适的方案,后来终于在网上找到了解决方案,现记录如下: 代码实现 /** * @param flag: 用于标记是否是非直接的文字输入 */ var flag = false; $('#id').on({ 'compositionstart': function()