正则表达式和NSPredicate
Posted 天天宜读
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正则表达式和NSPredicate相关的知识,希望对你有一定的参考价值。
ios一些常用的正则表达式
1、非负整数:^\d+$
2、正整数:^[0-9]*[1-9][0-9]*$
3、非正整数:^((-\d+)|(0+))$
4、负整数:^-[0-9]*[1-9][0-9]*$
5、整数:^-?\d+$
6、非负浮点数:^\d+(\.\d+)?$
7、正浮点数:^((0-9)+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$
8、非正浮点数:^((-\d+\.\d+)?)|(0+(\.0+)?))$
9、负浮点数:^(-((正浮点数正则式)))$
10、英文字符串:^[A-Za-z]+$
11、英文大写串:^[A-Z]+$
12、英文小写串:^[a-z]+$
13、英文字符数字串:^[A-Za-z0-9]+$
14、英数字加下划线串:^\w+$
16、URL:^[a-zA-Z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\s*)?$
或:^http:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\':+!]*([^<>""])*$
17、邮政编码:^[1-9]\d{5}$
18、中文:^[\u0391-\uFFE5]+$
20、手机号码:^((\(\d{2,3}\))|(\d{3}\-))?13\d{9}$
21、双字节字符(包括汉字在内):^\x00-\xff
22、匹配首尾空格:(^\s*)|(\s*$)(像vbscript那样的trim函数)
23、匹配html标记:<(.*)>.*<\/\1>|<(.*)\/>
24、匹配空行:\n[\s| ]*\r
25、提取信息中的网络链接:(h|H)(r|R)(e|E)(f|F) *= *('|")?(\w|\\|\/|\.)+('|"| *|>)?
27、提取信息中的图片链接:(s|S)(r|R)(c|C) *= *('|")?(\w|\\|\/|\.)+('|"| *|>)?
29、提取信息中的中国手机号码:(86)*0*13\d{9}
32、提取信息中的中国邮政编码:[1-9]{1}(\d+){5}
33、提取信息中的浮点数(即小数):(-?\d*)\.?\d+
34、提取信息中的任何数字 :(-?\d*)(\.\d+)?
35、IP:(\d+)\.(\d+)\.(\d+)\.(\d+)
37、腾讯QQ号:^[1-9]*[1-9][0-9]*$
38、帐号(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
39、中文、英文、数字及下划线:^[\u4e00-\u9fa5_a-zA-Z0-9]+$
40、匹配首尾空白字符的正则表达式:^\s*|\s*$
NSString *pattern = @"^\s*|\s*$";
NSRegularExpression *regex = [NSRegularExpressionregularExpressionWithPattern:pattern options:NSRegularExpressionCaseInsensitiveerror:&error];
讲一个例子:手机号的匹配
//因为各个运营商开头号码不同,这里只匹配11位是比较好的方法 <简单的匹配>
- (BOOL)isValidPhoneNumber {
NSString *regex = @"^[0-9]{11}";
return [selfisValidateByRegex:regex];
}
//或者精确点,但需要根据运营商更新<精准的匹配>
- (BOOL)wl_isMobileNumberClassification {
/**
* 手机号码
* 移动:134[0-8],135,136,137,138,139,150,151,157,158,159,182,187,188,1705
* 联通:130,131,132,152,155,156,185,186,1709
* 电信:133,1349,153,180,189,1700
*/
/**
10 * 中国移动:ChinaMobile
11 *134[0-8],135,136,137,138,139,150,151,157,158,159,182,187,188,1705
12
*/
NSString * CM = @"^1(34[0-8]|(3[5-9]|5[017-9]|8[278])\\\\d|705)\\\\d{7}$";
/**
15 * 中国联通:ChinaUnicom
16 * 130,131,132,152,155,156,185,186,1709
17
*/
NSString * CU = @"^1((3[0-2]|5[256]|8[56])\\\\d|709)\\\\d{7}$";
/**
20 * 中国电信:ChinaTelecom
21 * 133,1349,153,180,189,1700
22
*/
NSString * CT = @"^1((33|53|8[09])\\\\d|349|700)\\\\d{7}$";
/**
25 * 大陆地区固话及小灵通
26 * 区号:010,020,021,022,023,024,025,027,028,029
27 * 号码:七位或八位
28
*/
NSString * PHS = @"^0(10|2[0-5789]|\\\\d{3})\\\\d{7,8}$";
if (([selfisValidateByRegex:CM])
|| ([selfisValidateByRegex:CU])
|| ([selfisValidateByRegex:CT])
|| ([selfisValidateByRegex:PHS])) {
returnYES;
}else {
returnNO;
}
}
- (BOOL)isValidateByRegex:(NSString *)regex {
NSPredicate *pre = [NSPredicatepredicateWithFormat:@"SELF MATCHES%@",regex];
return [pre evaluateWithObject:self];
}
/**
@brief 是否符合最小长度、最长长度,是否包含中文,数字,字母,其他字符,首字母是否可以为数字
@param minLenth 账号最小长度
@param maxLenth 账号最长长度
@param containChinese 是否包含中文
@param containDigtal 包含数字
@param containLetter 包含字母
@param containOtherCharacter 其他字符
@param firstCannotBeDigtal 首字母不能为数字
@return 正则验证成功返回YES, 否则返回NO
*/
- (BOOL)isValidWithMinLenth:(NSInteger)minLenth
maxLenth:(NSInteger)maxLenth
containChinese:(BOOL)containChinese
containDigtal:(BOOL)containDigtal
containLetter:(BOOL)containLetter
containOtherCharacter:(NSString *)containOtherCharacter
firstCannotBeDigtal:(BOOL)firstCannotBeDigtal;
{
NSString *hanzi = containChinese ? @"\\u4e00-\\u9fa5" : @"";
NSString *first = firstCannotBeDigtal ? @"^[a-zA-Z_]" : @"";
NSString *lengthRegex = [NSStringstringWithFormat:@"(?=^.{%@,%@}$)", @(minLenth), @(maxLenth)];
NSString *digtalRegex = containDigtal ? @"(?=(.*\\\\d.*){1})" : @"";
NSString *letterRegex = containLetter ? @"(?=(.*[a-zA-Z].*){1})" : @"";
NSString *characterRegex = [NSStringstringWithFormat:@"(?:%@[%@A-Za-z0-9%@]+)", first, hanzi, containOtherCharacter ? containOtherCharacter : @""];
NSString *regex = [NSStringstringWithFormat:@"%@%@%@%@", lengthRegex, digtalRegex, letterRegex, characterRegex];
return [selfisValidateByRegex:regex];
}
NSPredicate的基本语法
NSPredicate类是用来定义逻辑条件约束的获取或内存中的过滤搜索。
可以使用谓词来表示逻辑条件,用于描述对象持久性存储在内存中的对象过滤。其实意思就是:我是一个过滤器,不符合条件的都滚开。
NSNumber *testNumber = @123;
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF= 123"];
if ([predicateevaluateWithObject:testNumber]) {
NSLog(@"testString:%@", testNumber);
}
我们使用一门语言,无论是外语还是计算机语言,总是从语法开始的,这样我们才能正确的把握逻辑。所以我们从语法开始说起。在这部分我们仅关心其语法的使用
只要我们使用谓词(NSPredicate)都需要为谓词定义谓词表达式,而这个表达式必须是一个返回BOOL的值。
谓词表达式由表达式、运算符和值构成。
字符串比较运算符
BEGINSWITH:检查某个字符串是否以指定的字符串开头(如判断字符串是否以a开头:BEGINSWITH 'a')
ENDSWITH:检查某个字符串是否以指定的字符串结尾
CONTAINS:检查某个字符串是否包含指定的字符串
LIKE:检查某个字符串是否匹配指定的字符串模板。其之后可以跟?代表一个字符和*代表任意多个字符两个通配符。比如"name LIKE '*ac*'",这表示name的值中包含ac则返回YES;"nameLIKE '?ac*'",表示name的第2、3个字符为ac时返回YES。
MATCHES:检查某个字符串是否匹配指定的正则表达式。虽然正则表达式的执行效率是最低的,但其功能是最强大的,也是我们最常用的。
集合运算符
ANY、SOME:集合中任意一个元素满足条件,就返回YES。
ALL:集合中所有元素都满足条件,才返回YES。
NONE:集合中没有任何元素满足条件就返回YES。如:NONE person.age < 18,表示person集合中所有元素的age>=18时,才返回YES。
IN:等价于SQL语句中的IN运算符,只有当左边表达式或值出现在右边的集合中才会返回YES。
以上是关于正则表达式和NSPredicate的主要内容,如果未能解决你的问题,请参考以下文章