正则表达式和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,1881705

     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的第23个字符为ac时返回YES

 MATCHES:检查某个字符串是否匹配指定的正则表达式。虽然正则表达式的执行效率是最低的,但其功能是最强大的,也是我们最常用的。

集合运算符

ANYSOME:集合中任意一个元素满足条件,就返回YES

ALL:集合中所有元素都满足条件,才返回YES

NONE:集合中没有任何元素满足条件就返回YES。如:NONE person.age < 18,表示person集合中所有元素的age>=18时,才返回YES

IN:等价于SQL语句中的IN运算符,只有当左边表达式或值出现在右边的集合中才会返回YES

 


以上是关于正则表达式和NSPredicate的主要内容,如果未能解决你的问题,请参考以下文章

iOS之NSPredicate(正则表达式和UIBarController):谓词

正则表达式和NSPredicate

NSPredicate 正则表达式错误

NSPredicate 与正则表达式检查字母数字

NSpredicate 上的正则表达式未按预期工作

NSPredicate 正则表达式不起作用