正则表达不再靠control+v(实操篇)

2018-05-11  本文已影响12人  HotCatLx

1. 前言

2.子表达式

2.1 概念

2.2 实战-IP地址的匹配

IP地址规则:

  1. 所有的一位数和两位数
  2. 三位数的第一位为 1
  3. 如果三位数的第一位为 2 ,且第二位从 0 到 4
  4. 如果三位数的前二位为 25 ,且第三位从 0 到 5
  5. 总结:0-255.0-255.0-255.0-255 就是我们要写的

解析:
1.将整个正则拆成两个部分((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))\.){3}((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5])),前一部分重复三次用来表示前面三组数字,并且以.结尾,后一部分表示最后一组IP地址
2.第一部分:(\d{1,2}),这个子表达式将匹配一位或者两位任意数字
3.第二部分:((1\d{2}),这个子表达式将匹配以1开头的后两位任意数字的三位数字
4.第三部分:(2[0-4]\d),这个子表达式将匹配以2开头的中间一位为0-4,第三位为任意数字的字符串
5.第四部分:(25[0-5]),这个子表达式将匹配以25开头的尾数为0-5的三位数字

2.3 年份匹配

1.19|20\d{2}这个表达式没有达到我们的效果
2.这个表达式其实的效果是匹配19(两位)和以20开头的四位数字
3.这里就能体现子表达式的效果,我们想要的是19或者20开头的四位数字,那么我们完全可以这部分用子表达式括起来,来实现效果

年份匹配-正确版本.png

2.4 HTML标签匹配

2.4.1 后向引用

2.4.2 HTML标签匹配之向后引用

<[hH]([1-5])>中将第一个子表达式使用()括起来,在缓存中使用这个子表达式默认为第一个分组
</[hH]\1>\1使用第一个的子表达式的匹配取值应用到第二处,不如前面匹配了1,后面只能匹配1

3,实际开发应用

3.1 查找替换文本

3.2 校验字符串是否符合规则-NSPredicate

NSString *string = @"hotCat";
//正则
NSString *regex = @"^ho[a-zA-Z]{2,}*$";
//创建NSPredicate
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
BOOL result = [predicate evaluateWithObject:string];

3.3 字符串某一个字符或者字符集的定位

NSString *string = @"hotCat123";
//使用正则\d+去string中进行匹配,得到的时匹配到的range,在这里为{4,3}。
NSRange range = [string rangeOfString:@"\\d+" options:NSRegularExpressionSearch];
//如果匹配到就打印匹配到的子字符串,在这里为123。
if (range.location != NSNotFound)
{
    NSLog(@"%@",[string substringWithRange:range]);
}

分析:
1.\d+用来查找数字
2.rangeOfString:options:会返回一个NSRange,用来接收匹配的范围options必须要用NSRegularExpressionSearch,代表用正则去匹配
3.当写正则字符串时,\需要写成\\ ,所以,\d+需要写成\\d+

3.4 NSRegularExpression

3.5 其它

4. 最后的福利

/**
     * 手机号码:
     * 13[0-9], 14[5,7], 15[0, 1, 2, 3, 5, 6, 7, 8, 9], 17[0, 1, 6, 7, 8], 18[0-9]
     * 移动号段: 134,135,136,137,138,139,147,150,151,152,157,158,159,170,178,182,183,184,187,188
     * 联通号段: 130,131,132,145,155,156,170,171,175,176,185,186
     * 电信号段: 133,149,153,170,173,177,180,181,189
     */
    NSString *MOBILE = @"^1(3[0-9]|4[57]|5[0-35-9]|7[0135678]|8[0-9])\\d{8}$";
    /**
     * 中国移动:China Mobile
     * 134,135,136,137,138,139,147,150,151,152,157,158,159,170,178,182,183,184,187,188
     */
    NSString *CM = @"^1(3[4-9]|4[7]|5[0-27-9]|7[08]|8[2-478])\\d{8}$";
    /**
     * 中国联通:China Unicom
     * 130,131,132,145,155,156,170,171,175,176,185,186
     */
    NSString *CU = @"^1(3[0-2]|4[5]|5[56]|7[0156]|8[56])\\d{8}$";
    /**
     * 中国电信:China Telecom
     * 133,149,153,170,173,177,180,181,189
     */
    NSString *CT = @"^1(3[3]|4[9]|53|7[037]|8[019])\\d{8}$";


邮箱:   ^[a-zA-Z0-9]{4,}@[a-z0-9A-Z]{2,}\\.[a-zA-Z]{2,}$
大陆固定电话号码:    ^\\d{4}-|\\d{3}-)?(\\d{8}|\\d{7}$
身份证号:    \\d{14}[[0-9],0-9xX]
Email地址:    ^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\.\\w+([-.]\\w+)*$
纯数字:   ^[0-9]*$
由数字和英文字母组成:   ^[A-Za-z0-9]+$
QQ号:   ^[1-9][0-9]\{4,\}$
中国邮政编码:   ^[1-9]\\d{5}(?!\\d)$
URL:  ^http(s)?://([\\w-]+\\.)+[\\w-]+(/[\\w- ./?%&=]*)?$
纯汉字中文:^[\u4e00-\u9fa5]{0,}$

Thanks.JPG
上一篇 下一篇

猜你喜欢

热点阅读