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 @interface RegularTool: NSObject
12
13 /*!
14  *  匹配固定电话号码
15  *
16  *  @param number 需要匹配的固话号码
17  *
18  *  @return 返回匹配结果
19  */
20 + (BOOL)matchTelephoneNumber:(NSString *)number;
21
22 /*!
23  *  匹配手机号码
24  *
25  *  @param number 需要匹配的手机号码
26  *
27  *  @return 返回匹配结果
28  */
29 + (BOOL)matchMobilephoneNumber:(NSString *)number;
30
31 /*!
32  *  匹配3-15位的中文或英文(用户名)
33  *
34  *  @param username 需要匹配的字符串
35  *
36  *  @return 返回匹配结果
37  */
38 + (BOOL)matchUsername:(NSString *)username;
39
40 /*!
41  *  匹配6-18位的数字和字母组合(密码)
42  *
43  *  @param password 需要匹配的字符串
44  *
45  *  @return 返回匹配结果
46  */
47 + (BOOL)matchPassword:(NSString *)password;
48
49 /*!
50  *  匹配邮箱帐号
51  *
52  *  @param email 需要匹配的邮箱帐号
53  *
54  *  @return 返回匹配结果
55  */
56 + (BOOL)matchEmail:(NSString *)email;
57
58 /*!
59  *  匹配身份证号码
60  *
61  *  @param idCard 需要匹配的身份证号码
62  *
63  *  @return 返回匹配结果
64  */
65 + (BOOL)matchUserIdCard:(NSString *)idCard;
66
67 /*!
68  *  匹配URL字符串
69  *
70  *  @param urlStr 需要匹配的URL字符串
71  *
72  *  @return 返回匹配结果
73  */
74 + (BOOL)matchURLStr:(NSString *)urlStr;
75
76 /*!
77  *  匹配¥:价格字符串
78  *
79  *  @param priceStr 包含价格的字符串
80  *
81  *  @return 返回匹配结果
82  */
83 + (BOOL)matchPriceStr:(NSString *)priceStr;
84
85 @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 + (BOOL)matchTelephoneNumber:(NSString *)number {
 15     NSString *pattern = @"^(\\d{3,4}-)\\d{7,8}$";
 16     return [RegularTool matchString:number withPattern:pattern];
 17 }
 18
 19 #pragma mark - 匹配手机号码
 20 + (BOOL)matchMobilephoneNumber:(NSString *)number {
 21     NSString *pattern = @"^(0|86)?1([358][0-9]|7[678]|4[57])\\d{8}$";
 22     return [RegularTool matchString:number withPattern:pattern];
 23 }
 24
 25 #pragma mark - 匹配3-15位的中文或英文(用户名)
 26 + (BOOL)matchUsername:(NSString *)username {
 27     NSString *pattern = @"^[a-zA-Z一-龥]{3,15}$";
 28     return [RegularTool matchString:username withPattern:pattern];
 29 }
 30
 31 #pragma mark - 匹配6-18位的数字和字母组合(密码)
 32 + (BOOL)matchPassword:(NSString *)password {
 33     NSString *pattern = @"^(?![0-9]+$)(?![a-zA-Z]+$)[a-zA-Z0-9]{6,18}$";
 34     return [RegularTool matchString: password withPattern: pattern];
 35 }
 36
 37 #pragma mark - 匹配邮箱帐号
 38 + (BOOL)matchEmail:(NSString *)email {
 39     NSString *pattern =
 40     @"^[a-z0-9]+([\\._\\-]*[a-z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+\\.){1,63}[a-z0-9]+$";
 41     return [RegularTool matchString:email withPattern:pattern];
 42 }
 43
 44 #pragma mark - 匹配身份证号码
 45 + (BOOL)matchUserIdCard:(NSString *)idCard {
 46     NSString *pattern =
 47     @"(^[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])$)";
 48     return [RegularTool matchString:idCard withPattern:pattern];
 49 }
 50
 51 #pragma mark - 匹配URL字符串
 52 + (BOOL)matchURLStr:(NSString *)urlStr {
 53     NSString *pattern = @"^[0-9A-Za-z]{1,50}$";
 54     return [RegularTool matchString:urlStr withPattern: pattern];
 55 }
 56
 57 #pragma mark - 匹配¥:价格字符串
 58 + (BOOL)matchPriceStr:(NSString *)priceStr {
 59     NSError *error = nil;
 60     NSRegularExpression *regular = [NSRegularExpression regularExpressionWithPattern:@"¥(\\d+(?:\\.\\d+)?)" options: 1 << 0 error: &error];
 61     if (!error) {
 62         NSArray<NSTextCheckingResult *> *result = [regular matchesInString:priceStr options:NSMatchingWithoutAnchoringBounds range:NSMakeRange(0, priceStr.length)];
 63         if (result) {
 64             for (NSTextCheckingResult *checkingRes in result) {
 65                 if (checkingRes.range.location == NSNotFound) {
 66                     continue;
 67                 }
 68                 NSLog(@"%@",[priceStr substringWithRange:checkingRes.range]);
 69                 //NSLog(@"%@",[priceStr substringWithRange:[res rangeAtIndex:1]]);
 70             }
 71         }
 72         return YES;
 73     }
 74     NSLog(@"匹配失败,Error: %@",error);
 75     return NO;
 76 }
 77
 78
 79 /*!
 80  *  正则匹配
 81  *
 82  *  @param str     匹配的字符串
 83  *  @param pattern 匹配规则
 84  *
 85  *  @return 返回匹配结果
 86  */
 87 + (BOOL)matchString:(NSString *)str withPattern:(NSString *)pattern {
 88     NSError *error = nil;
 89     NSRegularExpression *regular = [NSRegularExpression regularExpressionWithPattern: pattern options: NSRegularExpressionCaseInsensitive error: &error];
 90     if (!error) {
 91         NSTextCheckingResult *result = [regular firstMatchInString:str options:0 range:NSMakeRange(0, str.length)];
 92         if (result) {
 93             NSLog(@"匹配成功,Result: %@",[str substringWithRange:result.range]);
 94             return YES;
 95         }
 96     }
 97     NSLog(@"匹配失败,Error: %@",error);
 98     return NO;
 99 }
100
101 @end

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

时间: 2024-10-01 03:26:30

iOS 中的正则匹配(工具类)的相关文章

多媒体编程——ios摄像头图像抓取工具类

工具类提供预览图像画面,自动处理旋转,并且以主动方式抓取图像(这样帧率可以无限大) 系统的接口多是异步接收图像,像我这种强迫症怎么受得了,必须吧被动接收图像的方式改成主动抓取. 头文件 #import <Foundation/Foundation.h> #import <AVFoundation/AVFoundation.h> //这些比例都是4:3的比例. typedef enum TKVideoFrameSize { tkVideoFrame480x360 = 480 <

c语言中字符串操作的工具类

 1.编写头文件 #define _CRT_SECURE_NO_WARNINGS //#pragmawarning(disable:4996) #include <stdio.h> #include <stdlib.h> #include <string.h> struct CString { char *p;        //保存字符串首地址 int reallength; //实际长度 }; typedef struct CString mystring;//

java中IO写文件工具类

下面是一些根据常用java类进行组装的对文件进行操作的类,平时,我更喜欢使用Jodd.io中提供的一些对文件的操作类,里面的方法写的简单易懂. 其中jodd中提供的JavaUtil类中提供的方法足够我们使用,里面的方法写的非常简练,例如append,read等方法,封装更好,更符合面向对象, 这里面我写的一些方法可多都是模仿jodd,从里面进行抽取出来的. /** * 获取路径文件夹下的所有文件 * @param path * @return */ public static File[] ge

PHP中preg_match正则匹配的/u /i /s是什么意思

PHP中preg_match正则匹配的/u /i  /s是什么意思  /u 表示按unicode(utf-8)匹配(主要针对多字节比如汉字) /i 表示不区分大小写(如果表达式里面有 a, 那么 A 也是匹配对象) /s 表示将字符串视为单行来匹配

iOS 中的第三方库管理工具

xcode没有android studio中的gradle进行第三方库管理,但是有第三方的库管理工具CocoaPods,https://github.com/CocoaPods/CocoaPods/wiki. 用了这个命令行工具,就可以方便地维护第三方库了. iOS 中的第三方库管理工具

Spring3中好用的工具类收集

1) 请求工具类 org.springframework.web.bind.ServletRequestUtils //取请求参数的整数值: public static Integer getIntParameter(ServletRequest request, String name) public static int getIntParameter(ServletRequest request, String name, int defaultVal) -->单个值 public sta

JAVA中使用MD5加密工具类实现对数据的加密处理

1.MD5工具类 package com.ssm.util; import java.security.MessageDigest; public class MD5Util { //将字节数组转成十六进制字符串 private static String byteArrayToHexString(byte b[]) { StringBuffer resultSb = new StringBuffer(); for (int i = 0; i < b.length; i++) resultSb.

java中excel导入\导出工具类

1.导入工具 1 package com.linrain.jcs.test; 2 3 4 import jxl.Cell; 5 import jxl.Sheet; 6 import jxl.Workbook; 7 import jxl.write.Label; 8 import jxl.write.WritableSheet; 9 10 import java.io.InputStream; 11 import java.lang.reflect.Field; 12 import java.te

ios 中Category类别(扩展类)专题总结

原创地址   http://www.code4blog.com/archives/294 类别 类别是一种为现有的类添加新方法的方式. 利用Objective-C的动态运行时分配机制,可以为现有的类添加新方法,这种为现有的类添加新方法的方式称为类别catagory,他可以为任何类添加新的方法,包括那些没有源代码的类. 类别使得无需创建对象类的子类就能完成同样的工作 一.创建类别 1.声明类别 声明类别与声明类的形式很相似 @interface  NSString(NumberConvenienc