正则表达式

正则表达式

正则表达式,又称正规表示法,是对字符串操作的一种逻辑公式。正则表达式可以检测给定的字符串是否符合我们定义的逻辑,也可以从字符串中获取我们想要的特定部分。它可以迅速地用极简单的方式达到字符串的复杂控制。


语法
首先,特殊符号 '^' 和 '$'。他们的作用是分别指出一个字符串的开始和结束。eg:

"^one": 表示所有以 "one" 开始的字符串("one cat" , "one123",...)
类似于:- (BOOL)hasPrefix:(NSString *)aString;

"a dog$": 表示所以以"a dog"结尾的字符串("it is a dog" , ...);
类似于:- (BOOL)hasSuffix:(NSString *)aString;

"^apple$": 表示开始和结尾都是 "apple" 的字符串,这个是唯一的 ~;

"banana": 表示任何包含"banana"的字符串。
类似于 iOS8的新方法- (BOOL)containsString:(NSString *)aString,搜索子串用的。

'*' , '+' 和 '?' 这三个符号 , 表示一个或 N 个字符重复出现的次数。它们分别表示"没有或更多"([0,+∞]取整), "一次或更多"([1,+∞]取整),"没有或一次"([0,1]取整)。下面是几个例子:
"ab*": 表示一个字符串有一个 a 后面跟着零个或若干个 b("a" , "ab" , "abbb" , ...);
"ab+": 表示一个字符串有一个 a 后面跟着至少一个 b 或者更多( "ab" , "abbb" , ...);
"ab?": 表示一个字符串有一个 a 后面跟着零个或者一个 b( "a" , "ab");
"a?b+$":表示在字符串的末尾有零个或一个 a 跟着一个或几个 b( "b" , "ab" , "bb" , "abb" , ...)。
可以用大括号括起来({}), 表示一个重复的具体范围。例如
"ab{4}": 表示一个字符串有一个 a 跟着 4 个 b("abbbb");
"ab{1,}": 表示一个字符串有一个 a 跟着至少 1 个 b("ab","abb","abbb",……);
"ab{3,4}": 表示一个字符串有一个 a 跟着 3 到 4 个 b("abbb","abbbb")。
那么,"*"可以用{0,}表示,"+"可以用{1,}表示,"?"可以用{0,1}表示
注意:可以没有下限,但是不能没有上限!例如"ab{,5}"是错误的写法

" | " 表示"或"操作:
"a|b": 表示一个字符串里有 "a" 或者 "b";
"(a|bcd)ef": 表示 "aef" 或 "bcdef";
"(a|b)*c": 表示一串 "a""b" 混合的字符串后面跟一个 "c";

方括号"[]"表示在括号内的众多字符中 , 查找方括号中的任何字符 , 例如
"[ab]": 表示一个字符串有一个 'a' 或 'b'(相当于"a|b");
"[a-d]": 表示一个字符串包含小写的 'a' 到 'd' 中的一个(相当于"a|b|c|d"或者"[abcd]");
"^[a-zA-Z]":表示一个以字母开头的字符串;
"[0-9]a":表示a前有一位的数字;
"[a-zA-Z0-9]$":表示一个字符串以一个字母或数字结束。
"@[^a-zA-Z]4@"表示两个"@"中不应该出现字母)。
在方括号里用 '^' 表示不希望出现的字符, '^' 应在方括号里的第一位。

"." 匹配除 "\r\n" 之外的任何单个字符(除行结束符\r和换行符\n):
"a.[a-z]": 表示一个字符串有一个 a 后面跟着一个任意字符和一个小写字母;
"^.{5}$": 表示任意 1 个长度为 5 的字符串;

"\num" 其中num是一个正整数。表示"\num"之前的字符出现相同的个数,例如
"(.)\1″: 表示两个连续的相同字符。
"10\{1,2}": 表示数字 1 后面跟着 1 或者 2 个 0 ("10","100")。
"0\{3,\}": 表示数字为至少3个连续的0 ("000" , "0000" , ...)。

常用的还有:
"\d" 匹配一个数字字符。等价于[0-9]。
"\D" 匹配一个非数字字符。等价于[^0-9]。
"\w" 匹配包括下划线的任何单词字符。等价于"[A-Za-z0-9_]"。
"\W" 匹配任何非单词字符。等价于"[^A-Za-z0-9_]"。
"\s" 匹配空白字符
"\S" 匹配非空白字符
"\b" 匹配单词边界
"\B" 匹配非单词边界

iOS中书写正则表达式,碰到转义字符,多加一个"\",例如:
全数字字符:@"^\\d\+$"   
iOS中有三种实现正则表达式匹配的方法:

1、NSPredicate (谓词) 匹配

判断用户输入的字符是否合法

//手机号简单匹配
NSString *email = @"15173265865";
NSString *regex = @"1[358][0-9]{9}" ;
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
BOOL isValid = [predicate evaluateWithObject:email];

2、NSString的API:rangeOfString:option:直接查找
判断用户输入的字符是否合法

//手机号简单匹配
NSString *searchText = @"15173265865";
NSString *regex = @"1[358][0-9]{9}" ;
NSRange range = [searchText rangeOfString:regex options:NSRegularExpressionSearch];
if (range.location != NSNotFound) {
    NSLog(@"%@", [searchText substringWithRange:range]);
}

3、正则表达式专用类NSRegularExpression
捕获用户输入的特定内容

//手机号简单匹配
NSString *searchText = @"15173265865/18551410506";
NSString *regexStr = @"1[358][0-9]{9}";
NSError *error;
NSRegularExpression *regular = [NSRegularExpression regularExpressionWithPattern:regexStr options:NSRegularExpressionCaseInsensitive error:&error];
if (error) return;
NSInteger count = [regular numberOfMatchesInString:searchText options:NSMatchingReportCompletion range:NSMakeRange(0, searchText.length)];
//当被检索的字符串太大时,用 block 控制查找
NSString *searchText = @"15173265865";
NSString *regex = @"1[358][0-9]{9}" ;

NSError *error;
NSRegularExpression *regular = [NSRegularExpression regularExpressionWithPattern:regexStr options:NSRegularExpressionCaseInsensitive error:&error];
if (error) return;

[regular enumerateMatchesInString:searchText options:NSMatchingReportCompletion range:NSMakeRange(0, searchText.length) usingBlock:^(NSTextCheckingResult * _Nullable result, NSMatchingFlags flags, BOOL * _Nonnull stop) {
    NSRange matchRange = result.range;
    NSLog(@"range:%@",NSStringFromRange(matchRange));
    NSString *str = [searchText substringWithRange:matchRange];
    NSLog(@"%@",str);
}];    
常用的正则表达式如下:(邮箱,电话号码,身份证,密码,昵称)
//邮箱
+ (BOOL) validateEmail:(NSString *)email
{
	NSString *emailRegex = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}";
	NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex];
	return [emailTest evaluateWithObject:email];
}


//手机号码验证
+ (BOOL) validateMobile:(NSString *)mobile
{
	//手机号以13, 15,18开头,八个 \d 数字字符
	NSString *phoneRegex = @"^((13[0-9])|(15[^4,\\D])|(18[0,0-9]))\\d{8}$";
	NSPredicate *phoneTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",phoneRegex];
	return [phoneTest evaluateWithObject:mobile];
}


//车牌号验证
+ (BOOL) validateCarNo:(NSString *)carNo
{
	NSString *carRegex = @"^[\u4e00-\u9fa5]{1}[a-zA-Z]{1}[a-zA-Z_0-9]{4}[a-zA-Z_0-9_\u4e00-\u9fa5]$";
	NSPredicate *carTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",carRegex];
	NSLog(@"carTest is %@",carTest);
	return [carTest evaluateWithObject:carNo];
}


//车型
+ (BOOL) validateCarType:(NSString *)CarType
{
	NSString *CarTypeRegex = @"^[\u4E00-\u9FFF]+$";
	NSPredicate *carTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",CarTypeRegex];
	return [carTest evaluateWithObject:CarType];
}


//用户名
+ (BOOL) validateUserName:(NSString *)name
{
	NSString *userNameRegex = @"^[A-Za-z0-9]{6,20}+$";
	NSPredicate *userNamePredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",userNameRegex];
	BOOL B = [userNamePredicate evaluateWithObject:name];
	return B;
}


//密码
+ (BOOL) validatePassword:(NSString *)passWord
{
	NSString *passWordRegex = @"^[a-zA-Z0-9]{6,20}+$";
	NSPredicate *passWordPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",passWordRegex];
	return [passWordPredicate evaluateWithObject:passWord];
}


//昵称
+ (BOOL) validateNickname:(NSString *)nickname
{
	NSString *nicknameRegex = @"^[\u4e00-\u9fa5]{4,8}$";
	NSPredicate *passWordPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",nicknameRegex];
	return [passWordPredicate evaluateWithObject:nickname];
}


//身份证号
+ (BOOL) validateIdentityCard: (NSString *)identityCard
{
	BOOL flag;
	if (identityCard.length <= 0) {
    	flag = NO;
    	return flag;
	}
	NSString *regex2 = @"^(\\d{14}|\\d{17})(\\d|[xX])$";
	NSPredicate *identityCardPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",regex2];
	return [identityCardPredicate evaluateWithObject:identityCard];
}   

//判断是否含有特殊字符
- (void) test {
	NSString *url = @"1229436624@qq.com";

	NSError *error;
	// 创建NSRegularExpression对象并指定正则表达式
	NSRegularExpression *regex = [NSRegularExpression
                              regularExpressionWithPattern:@"[`~!@#$^&*()=|{}':;',\\[\\].<>/?~!@#¥……&*()——|{}【】';:""'。,、?]"
                              options:0
                              error:&error];
	if (!error) {
    	NSArray *arr = [regex matchesInString:url options:NSMatchingReportCompletion range:NSMakeRange(0, url.length)];
    	if ([arr count] != 0) {
        	NSLog(@"包含一些特殊符号");
    	}
	}
	else {
    	NSLog(@"error - %@", error);
	}
}

常用的正则表达式

posted @ 2017-04-24 14:30  上水的花  阅读(195)  评论(0编辑  收藏  举报