iOS 正则表达

在实际开发中,我们常常需要用到正则来对一些字符串进行一些操作。如,身份证验证、手机号验证、邮箱验证等。iOS从4.0开始支持正则表达式,并抽象出两个类来供开发者使用 NSRegularExpressionNSTextCheckingResult

NSRegularExpression

// 根据所给的正则表达式创建一个NSRegularExpression类的实例,假如正则无效,那么将返回空和error
+ (nullable NSRegularExpression *)regularExpressionWithPattern:(NSString *)pattern options:(NSRegularExpressionOptions)options error:(NSError **)error;
- (nullable instancetype)initWithPattern:(NSString *)pattern options:(NSRegularExpressionOptions)options error:(NSError **)error NS_DESIGNATED_INITIALIZER;

// 一个只读的正则表达式
@property (readonly, copy) NSString *pattern;
// 正则表达式选项
@property (readonly) NSRegularExpressionOptions options;
// 匹配的个数
@property (readonly) NSUInteger numberOfCaptureGroups;

// 为正则语句每一个匹配类型添加一个'\'
// @"[0-9]{0,}D$" 输出:\[0-9]\{0,\}D\$
+ (NSString *)escapedPatternForString:(NSString *)string;
NSRegularExpressionOptions
typedef NS_OPTIONS(NSUInteger, NSRegularExpressionOptions) {
// 不区分大小写
   NSRegularExpressionCaseInsensitive             = 1 << 0,     
// 忽略正则中的空格和‘#-’前缀
   NSRegularExpressionAllowCommentsAndWhitespace  = 1 << 1,     
// 完整的正则,及不做其他处理
   NSRegularExpressionIgnoreMetacharacters        = 1 << 2,  
// 允许‘.’去匹配任意一个字符  ,包括行分隔符'\n'
   NSRegularExpressionDotMatchesLineSeparators    = 1 << 3,
// 允许‘^’和‘$’匹配开始和结束     
   NSRegularExpressionAnchorsMatchLines           = 1 << 4,  
// 设置\n为唯一的行分隔符,否则所有的都有效。  
   NSRegularExpressionUseUnixLineSeparators       = 1 << 5,     
// 使用Unicode TR#29标准作为词的边界,否则所有传统正则表达式的词边界都有效
   NSRegularExpressionUseUnicodeWordBoundaries    = 1 << 6    
};

NSMatching
typedef NS_OPTIONS(NSUInteger, NSMatchingOptions) {
//找到最长的匹配字符串后调用block回调
   NSMatchingReportProgress         = 1 << 0,      
//找到任何一个匹配串后都回调一次block
   NSMatchingReportCompletion       = 1 << 1,  
//从匹配范围的开始出进行极限匹配    
   NSMatchingAnchored               = 1 << 2,       
//允许匹配的范围超出设置的范围
   NSMatchingWithTransparentBounds  = 1 << 3,    
//禁止^和$自动匹配行还是和结束   
   NSMatchingWithoutAnchoringBounds = 1 << 4       
};

typedef NS_OPTIONS(NSUInteger, NSMatchingFlags) {
//匹配到最长串是被设置
   NSMatchingProgress               = 1 << 0,       
//全部分配完成后被设置
   NSMatchingCompleted              = 1 << 1, 
//匹配到设置范围的末尾时被设置      
   NSMatchingHitEnd                 = 1 << 2,      
//当前匹配到的字符串在匹配范围的末尾时被设置
   NSMatchingRequiredEnd            = 1 << 3,  
//由于错误导致的匹配失败时被设置    
   NSMatchingInternalError          = 1 << 4        
};

//这个方法会返回一个结果数组,将所有匹配的结果返回
- (NSArray<NSTextCheckingResult *> *)matchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;
//这个方法会返回匹配到得字符串的个数
- (NSUInteger)numberOfMatchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;
//这个方法会返回第一个查询到得结果,这个NSTextCheckingResult对象中有一个range属性,可以得到匹配到的字符串的范围。
- (nullable NSTextCheckingResult *)firstMatchInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;
//这个方法直接返回匹配到得范围,NSRange。
- (NSRange)rangeOfFirstMatchInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;

NSReplacement
// 获取替换过的字符串
- (NSString *)stringByReplacingMatchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range withTemplate:(NSString *)templ;
// 获取需要替换的个数
- (NSUInteger)replaceMatchesInString:(NSMutableString *)string options:(NSMatchingOptions)options range:(NSRange)range withTemplate:(NSString *)templ;

例子



NSString *url = @"NSString *url = @"kkkhttp://15215990299www.baidu15530628270.com";";
    NSString *regularString = @"\\d{3}-\\d{8}|\\d{3}-\\d{7}|\\d{4}-\\d{8}|\\d{4}-\\d{7}|1+[358]+\\d{9}|\\d{8}|\\d{7}";
    NSRegularExpression *regular = [NSRegularExpression regularExpressionWithPattern:regularString options:0 error:nil];
    
    if (regular) {
        NSTextCheckingResult *result = [regular firstMatchInString:url options:NSMatchingReportProgress range:NSMakeRange(0, url.length)];
        NSRange range = result.range;
        NSLog(@"result 1: %@",[url substringWithRange:range]);
        
        NSArray *arr = [regular matchesInString:url options:NSMatchingReportProgress range:NSMakeRange(0, url.length)];
        for (NSTextCheckingResult *result in arr) {
            NSLog(@"result >>: %@",[url substringWithRange:result.range]);
        }
        
        NSLog(@"%@",[regular stringByReplacingMatchesInString:url options:NSMatchingReportProgress range:NSMakeRange(0, url.length) withTemplate:@"J"]);
        NSMutableString *str = [NSMutableString stringWithString:url];
        NSLog(@"%ld, %@",[regular replaceMatchesInString:str options:0 range:NSMakeRange(0, url.length) withTemplate:@"J"], str);  
    }

// 结果
2017-05-11 16:49:15.017 CCZCheckResult[1245:139047] result 1: 15215990299
2017-05-11 16:49:15.018 CCZCheckResult[1245:139047] result >>: 15215990299
2017-05-11 16:49:15.018 CCZCheckResult[1245:139047] result >>: 15530628270
2017-05-11 16:49:15.018 CCZCheckResult[1245:139047] kkkhttp://Jwww.baiduJ.com
2017-05-11 16:49:15.018 CCZCheckResult[1245:139047] 2, kkkhttp://Jwww.baiduJ.com
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,440评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,814评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,427评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,710评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,625评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,014评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,511评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,162评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,311评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,262评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,278评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,989评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,583评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,664评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,904评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,274评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,856评论 2 339

推荐阅读更多精彩内容

  • iOS中使用正则表达式就不得不提NSRegularExpression,所以我们需要先搞清楚什么是NSRegula...
    sunmumu1222阅读 2,329评论 0 4
  • 一、什么是正则表达式 正则表达式,又称正规表示法,是对字符串操作的一种逻辑公式。正则表达式可以检测给定的字符串是否...
    见哥哥长高了阅读 2,001评论 6 48
  • 这篇文章其实是在学习正则表达式时网上一些资料的整合,所以只能算是一个总结性文章,不是自己原创,感谢各位的分享。参考...
    coder_zhengyi阅读 2,951评论 2 6
  • 参考:正则表达式、正则表达式30分钟入门教程、正则表达式的使用方法 一、概述 正则表达式(Regular Expr...
    夏天的风_song阅读 2,254评论 0 1
  • 一、什么是正则表达式 正则表达式,又称正规表示法,是对字符串操作的一种逻辑公式。正则表达式可以检测给定的字符串是否...
    Helen_kay阅读 2,750评论 0 2