iOS 中的正则匹配(工具类方法)

正则表达式

正则表达式是对字符串操作的一种逻辑公式, 用事先定义好的一些特定字符、及这些特定字符的组合, 组成一个"规则字符串",

这个"规则字符串"用来表达对字符串的一种过滤逻辑, 正则表达式就是用于描述这些规则的工具, 或者说, 正则表达式就是记录文本规则的代码.

在开发中, 我们经常会有查找符合某些复杂规则的字符串的需要,

比如数据校验: 判断用户的输入是否合法(如:用户注册的时候,QQ号码,电话号码,邮箱是否符合要求) 

下面让我们先来看看正则匹配常用的一些字符:

一. 常用通配符

 .     匹配除换行符以外的任意字符

\w   匹配字母或数字或下划线或汉字

\s    匹配任意的空白符(空格,tab\t,回车\r \n)

\d    匹配数字

^     匹配字符串的开始

$     匹配字符串的结束

\b    匹配单词的开始或结束

二. 常用反义通配符

\W      匹配任意不是字母,数字,下划线,汉字的字符

\S       匹配任意不是空白符的字符

\D       匹配任意非数字的字符

\B       匹配不是单词开头或结束的位置

[^x]    匹配除了x以外的任意字符

[^aeiou]  匹配除了aeiou这几个字母以外的任意字符

三. 集合

[xyz]     匹配xyz中任意的字符

[^xyz]  匹配不是xyz中的任意字符

[a-z]     匹配从小写字母a到小写字母z之间的任意字符

[^a-z]   匹配非从小写字母a到小写字母z之间的任意字符

四. 常用限定符

*      重复零次或更多次

+     重复一次或更多次

?      重复零次或一次

{n}  重复n次

{n,} 重复n次或更多次

{n,m} 重复n到m次

五. 贪婪和懒惰模式(默认是贪婪模式;在量词后面直接加上问号,就是非贪婪模式)

*?          重复任意次,但尽可能少重复

+?         重复一次或更多次,但尽可能少重复

??          重复零次或一次,但尽可能少重复

{n,m}?  重复n到m次,但尽可能少重复

{n,}?     重复n次以上,但尽可能少重复

 

以上就是正则表达式的匹配规则需要使用到的字符.

下面是我在开发中时常用到的和平时收集的一些正则匹配,为了后续方便,所以整理下封装成一个工具类,提供类方法来调用,返回匹配结果.

或许上面的匹配字符有些朋友看不太明白,那就不说废话了,上代码,多看几次,然后自己尝试着去写,很快就可以明白了.

- RegularTool.h

 1 //
 2 //  RegularTool.h
 3 //  正则匹配
 4 //
 5 //  Created by Arvin on 15/12/3.
 6 //  Copyright © 2015年 Arvin. All rights reserved.
 7 //
 8 
 9 #import <Foundation/Foundation.h>
10 
11 typedef void(^resultBlock)(NSString *res);
12 
13 @interface RegularTool: NSObject
14 
15 /*!
16  *  匹配固定电话号码
17  *
18  *  @param number 需要匹配的固话号码
19  *
20  *  @return 返回匹配结果
21  */
22 + (NSString *)matchTelephoneNumber:(NSString *)number;
23 
24 /*!
25  *  匹配手机号码
26  *
27  *  @param number 需要匹配的手机号码
28  *
29  *  @return 返回匹配结果
30  */
31 + (NSString *)matchMobilephoneNumber:(NSString *)number;
32 
33 /*!
34  *  匹配3-15位的中文或英文(用户名)
35  *
36  *  @param username 需要匹配的字符串
37  *
38  *  @return 返回匹配结果
39  */
40 + (NSString *)matchUsername:(NSString *)username;
41 
42 /*!
43  *  匹配6-18位的数字和字母组合(密码)
44  *
45  *  @param password 需要匹配的字符串
46  *
47  *  @return 返回匹配结果
48  */
49 + (NSString *)matchPassword:(NSString *)password;
50 
51 /*!
52  *  匹配邮箱帐号
53  *
54  *  @param email 需要匹配的邮箱帐号
55  *
56  *  @return 返回匹配结果
57  */
58 + (NSString *)matchEmail:(NSString *)email;
59 
60 /*!
61  *  匹配身份证号码
62  *
63  *  @param idCard 需要匹配的身份证号码
64  *
65  *  @return 返回匹配结果
66  */
67 + (NSString *)matchUserIdCard:(NSString *)idCard;
68 
69 /*!
70  *  匹配URL字符串
71  *
72  *  @param urlStr 需要匹配的URL字符串
73  *
74  *  @return 返回匹配结果
75  */
76 + (NSString *)matchURLStr:(NSString *)urlStr;
77 
78 /*!
79  *  匹配¥:价格字符串
80  *
81  *  @param priceStr 包含价格的字符串
82  *
83  *  @return 返回匹配结果
84  */
85 + (BOOL)matchPriceStr:(NSString *)priceStr;
86 
87 @end

- RegularTool.m

  1 //
  2 //  RegularTool.m
  3 //  正则匹配
  4 //
  5 //  Created by Arvin on 15/12/3.
  6 //  Copyright © 2015年 Arvin. All rights reserved.
  7 //
  8 
  9 #import "RegularTool.h"
 10 
 11 @implementation RegularTool
 12 
 13 #pragma mark - 匹配固定电话号码
 14 + (NSString *)matchTelephoneNumber:(NSString *)number {
 15     NSString *pattern = @"^(\\d{3,4}-)\\d{7,8}$";
 16     __block NSString *result;
 17     [RegularTool matchString:number withPattern:pattern resultBlock:^(NSString *res) {
 18         result = res;
 19     }];
 20     return result;
 21 }
 22 
 23 #pragma mark - 匹配手机号码
 24 + (NSString *)matchMobilephoneNumber:(NSString *)number {
 25     NSString *pattern = @"^(0|86)?1([358][0-9]|7[678]|4[57])\\d{8}$";
 26     __block NSString *result;
 27     [RegularTool matchString:number withPattern:pattern resultBlock:^(NSString *res) {
 28         result = res;
 29     }];
 30     return result;
 31 }
 32 
 33 #pragma mark - 匹配3-15位的中文或英文(用户名)
 34 + (NSString *)matchUsername:(NSString *)username {
 35     NSString *pattern = @"^[a-zA-Z一-龥]{3,15}$";
 36     __block NSString *result;
 37     [RegularTool matchString:username withPattern:pattern resultBlock:^(NSString *res) {
 38         result = res;
 39     }];
 40     return result;
 41 }
 42 
 43 #pragma mark - 匹配6-18位的数字和字母组合(密码)
 44 + (NSString *)matchPassword:(NSString *)password {
 45     NSString *pattern = @"^(?![0-9]+$)(?![a-zA-Z]+$)[a-zA-Z0-9]{6,18}$";
 46     __block NSString *result;
 47     [RegularTool matchString: password withPattern: pattern resultBlock:^(NSString *res) {
 48         result = res;
 49     }];
 50     return result;
 51 }
 52 
 53 #pragma mark - 匹配邮箱帐号
 54 + (NSString *)matchEmail:(NSString *)email {
 55     NSString *pattern =
 56     @"^[a-z0-9]+([\\._\\-]*[a-z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+\\.){1,63}[a-z0-9]+$";
 57     __block NSString *result;
 58     [RegularTool matchString:email withPattern:pattern resultBlock:^(NSString *res) {
 59         result = res;
 60     }];
 61     return result;
 62 }
 63 
 64 #pragma mark - 匹配身份证号码
 65 + (NSString *)matchUserIdCard:(NSString *)idCard {
 66     NSString *pattern =
 67     @"(^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}$)|(^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])((\\d{4})|\\d{3}[Xx])$)";
 68     __block NSString *result;
 69     [RegularTool matchString:idCard withPattern:pattern resultBlock:^(NSString *res) {
 70         result = res;
 71     }];
 72     return result;
 73 }
 74 
 75 #pragma mark - 匹配URL字符串
 76 + (NSString *)matchURLStr:(NSString *)urlStr {
 77     NSString *pattern = @"^[0-9A-Za-z]{1,50}$";
 78     __block NSString *result;
 79     [RegularTool matchString:urlStr withPattern: pattern resultBlock:^(NSString *res) {
 80         result = res;
 81     }];
 82     return result;
 83 }
 84 
 85 #pragma mark - 匹配¥:价格字符串
 86 + (BOOL)matchPriceStr:(NSString *)priceStr {
 87     NSError *error = nil;
 88     NSString *pattern = @"¥(\\d+(?:\\.\\d+)?)";
 89     NSRegularExpression *regular = [NSRegularExpression regularExpressionWithPattern:pattern options: 1 << 0 error: &error];
 90     if (!error) {
 91         NSArray<NSTextCheckingResult *> *result = [regular matchesInString:priceStr options:NSMatchingWithoutAnchoringBounds range:NSMakeRange(0, priceStr.length)];
 92         if (result) {
 93             for (NSTextCheckingResult *checkingRes in result) {
 94                 if (checkingRes.range.location == NSNotFound) {
 95                     continue;
 96                 }
 97                 NSLog(@"%@",[priceStr substringWithRange:checkingRes.range]);
 98                 //NSLog(@"%@",[priceStr substringWithRange:[res rangeAtIndex:1]]);
 99             }
100         }
101         return YES;
102     }
103     NSLog(@"匹配失败,Error: %@",error);
104     return NO;
105 }
106 
107 
108 /*!
109  *  正则匹配
110  *
111  *  @param str     匹配的字符串
112  *  @param pattern 匹配规则
113  *
114  *  @return 返回匹配结果
115  */
116 + (BOOL)matchString:(NSString *)str withPattern:(NSString *)pattern resultBlock:(resultBlock)block {
117     NSError *error = nil;
118     NSRegularExpression *regular = [NSRegularExpression regularExpressionWithPattern: pattern options: NSRegularExpressionCaseInsensitive error: &error];
119     if (!error) {
120         NSTextCheckingResult *result = [regular firstMatchInString:str options:0 range:NSMakeRange(0, str.length)];
121         if (result) {
122             NSLog(@"匹配成功");
123             block([str substringWithRange:result.range]);
124             return YES;
125         } else {
126             NSLog(@"匹配失败");
127             return NO;
128         }
129     }
130     NSLog(@"匹配失败,Error: %@",error);
131     return NO;
132 }
133 
134 @end

END! 欢迎留言交流,一起学习...

posted @ 2016-01-03 22:44  Arvin~  阅读(2671)  评论(0编辑  收藏  举报