美文网首页
正则相关

正则相关

作者: 跃文 | 来源:发表于2018-06-25 13:52 被阅读0次

正则表达式基本语法

正则表达式常见字符

test            # 匹配包含test的字符串
.               # 匹配除换行符外任意字符
\               # 转义字符
[abc]或[a-c]    # 匹配字符类,如例子匹配a,b,c中的任何一个
[^abc]          # 匹配除了a,b,c以外的所有字符

正则表达式特殊字符

\d                  # 数字,等同于[0-9]
\D                  # 非数字
\s                  # 空白字符(包括换行、Tab等)
\S                  # 非空白字符
\w                  # 单词,等用于[a-zA-Z0-9_]
\W                  # 非单词

正则表达式数量词

c*                  # 匹配字符"c" 0或无限次
c+                  # 匹配字符"c" 1次以上
c?                  # 匹配字符"c" 0或1次
c{3}                # 匹配字符"c" 3次
c{3,5}              # 匹配字符"c" 3到5次

正则表达式边界匹配

^abc                # 匹配"abc"开头的字符串
abc$                # 匹配"abc"结尾的字符串

正则表达式逻辑或分组

c|b                 # 匹配"c"或"b"
(ab|cd)             # 匹配"ab"或"cd"
(?P<name>abc)       # 匹配"abc"并命名为name
(?P=name)           # 前文中的name组

实例分析 匹配用户手机号

根据上面的语法,我用OC语言写出来的正则表达式匹配手机号的代码如下:

NSString *pattern = @"^1+[3578]+\\d{9}";
NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pattern];
BOOL isMatch = [pred evaluateWithObject:telNumber];
return isMatch; 

我们来分析我写的这段正则表达式,首先是边界匹配^1手机号一定是1开头,所以我们的开头用边界匹配1。

[3578] 我们用中括号[]来匹配字符类,说明第二位数字是3、5、7、8中任意一个就可以,目前17也是新开号段,所以得考虑进去匹配上。

最后\d{9}这里要拆分开看,首先\d表示数字,等同于[0-9],而{9}表示匹配数字\d 9次。这样,就完成了一个11位手机号码的校验。

封装常用的正则表达式方法

在这里,我把常用的正则表达式的匹配方法,封装起来,项目中基本都会用到

#pragma mark - 正则匹配手机号
+ (BOOL)checkTelNumber:(NSString *) telNumber
{
    NSString *pattern = @"^1+[3578]+\\d{9}";
    NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pattern];
    BOOL isMatch = [pred evaluateWithObject:telNumber];
    return isMatch;
}

#pragma mark - 正则匹配用户密码6-18位数字和字母组合
+ (BOOL)checkPassword:(NSString *) password
{
    NSString *pattern = @"^(?![0-9]+$)(?![a-zA-Z]+$)[a-zA-Z0-9]{6,18}";
    NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pattern];
    BOOL isMatch = [pred evaluateWithObject:password];
    return isMatch;
}

#pragma mark - 正则匹配用户姓名,20位的中文或英文
+ (BOOL)checkUserName : (NSString *) userName
{
    NSString *pattern = @"^[a-zA-Z\u4E00-\u9FA5]{1,20}";
    NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pattern];
    BOOL isMatch = [pred evaluateWithObject:userName];
    return isMatch;
}

#pragma mark - 正则匹配用户身份证号15或18位
+ (BOOL)checkUserIdCard: (NSString *) idCard
{
    NSString *pattern = @"(^[0-9]{15}$)|([0-9]{17}([0-9]|X)$)";
    NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pattern];
    BOOL isMatch = [pred evaluateWithObject:idCard];
    return isMatch;
}

+ (BOOL) checkUserIdCard:(NSString *)sPaperId
{
    //判断位数
    if ([sPaperId length] != 15 && [sPaperId length] != 18) {
        return NO;
    }
    NSString *carid = sPaperId;
    long lSumQT =0;
    //加权因子
    int R[] ={7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };
    //校验码
    unsigned char sChecker[11]={'1','0','X', '9', '8', '7', '6', '5', '4', '3', '2'};
    //将15位身份证号转换成18位
    NSMutableString *mString = [NSMutableString stringWithString:sPaperId];
    if ([sPaperId length] == 15) {
        [mString insertString:@"19" atIndex:6];
        long p = 0;
        const char *pid = [mString UTF8String];
        for (int i=0; i<=16; i++)
        {
            p += (pid[i]-48) * R[i];
        }
        int o = p%11;
        NSString *string_content = [NSString stringWithFormat:@"%c",sChecker[o]];
        [mString insertString:string_content atIndex:[mString length]];
        carid = mString;
    }
    //判断地区码
    NSString * sProvince = [carid substringToIndex:2];
    if (![self areaCode:sProvince]) {
        return NO;
    }
    //判断年月日是否有效
    //年份
    int strYear = [[self getStringWithRange:carid Value1:6 Value2:4] intValue];
    //月份
    int strMonth = [[self getStringWithRange:carid Value1:10 Value2:2] intValue];
    //日
    int strDay = [[self getStringWithRange:carid Value1:12 Value2:2] intValue];
    NSTimeZone *localZone = [NSTimeZone localTimeZone];
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateStyle:NSDateFormatterMediumStyle];
    [dateFormatter setTimeStyle:NSDateFormatterNoStyle];
    [dateFormatter setTimeZone:localZone];
    [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
    NSDate *date=[dateFormatter dateFromString:[NSString stringWithFormat:@"%d-%d-%d 12:01:01",strYear,strMonth,strDay]];
    if (date == nil) {
        return NO;
    }
    const char *PaperId  = [carid UTF8String];
    //检验长度
    if( 18 != strlen(PaperId)) return -1;
    //校验数字
    for (int i=0; i<18; i++)
    {
        if ( !isdigit(PaperId[i]) && !(('X' == PaperId[i] || 'x' == PaperId[i]) && 17 == i) )
        {
            return NO;
        }
    }
    //验证最末的校验码
    for (int i=0; i<=16; i++)
    {
        lSumQT += (PaperId[i]-48) * R[i];
    }
    if (sChecker[lSumQT%11] != PaperId[17] )
    {
        return NO;
    }
    return YES;
}

#pragma mark - 正则匹员工号,12位的数字
+ (BOOL)checkEmployeeNumber : (NSString *) number
{
    NSString *pattern = @"^[0-9]{12}";
    
    NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pattern];
    BOOL isMatch = [pred evaluateWithObject:number];
    return isMatch;
}

#pragma mark - 正则匹配URL
+ (BOOL)checkURL : (NSString *) url
{
    NSString *pattern = @"^[0-9A-Za-z]{1,50}";
    NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pattern];
    BOOL isMatch = [pred evaluateWithObject:url];
    return isMatch;
}

#pragma mark -是否是邮政编码
+(BOOL)CheckStringIsPostCode:(NSString *) string
{    
    NSString * reg = @"[1-9]\\d{5}(?!\\d)";
    NSPredicate * pre = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",reg];
    BOOL isMatch = [pre evaluateWithObject:string];
    return isMatch;
}

#pragma mark - 是否是中文
- (BOOL)isChinese 
{    
    NSString *match = @"(^[\u4e00-\u9fa5]+$)";
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF matches %@", match];
    BOOL isMatch = [predicate evaluateWithObject:self];
    return isMatch;
}

#pragma mark -是否是邮箱
+ (BOOL)CheckStringIsEmail:(NSString *)string {
    
    NSString * reg = @"^[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}";
    NSPredicate * pre = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",reg];
    BOOL isMatch = [pre evaluateWithObject:string];
    return isMatch;
}

#pragma mark -是否是座机号码
+(BOOL)CheckStringIsHomeLine:(NSString *) string{
    
    string = [string stringByReplacingOccurrencesOfString:@"-" withString:@""];
    string = [string stringByReplacingOccurrencesOfString:@" " withString:@""];
    NSString *nameregex = [NSString stringWithFormat:@"%@",@"(\(\\d{3,4}\)|\d{3,4}-|\s)?\\d{8}"];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", nameregex];
    
    BOOL isMatch = [predicate evaluateWithObject:string];
    return isMatch;
}

相关文章

  • 正则相关

    正则表达式基本语法 正则表达式常见字符 正则表达式特殊字符 正则表达式数量词 正则表达式边界匹配 正则表达式逻辑或...

  • 正则相关

    ^a 以a开头的字符/s 空白字符/S 非空白字符/d 匹配一个数字字符,/\d/ = /[0-9]/

  • 正则相关

    regular expression 正则表达式的创建 字面量模式 let reg = /\d+/; 缺点是无法...

  • 三剑客_grep

    grep grep 相关参数 grep + 正则表达式(扩展正则)

  • PHP 基础篇 - PHP 正则官方文档汇总

    一、PCRE 正则语法 下面是 PHP 的 PCRE 正则语法(模式语法)相关文档,详情请查阅相关链接: 简介 分...

  • 可视化正则表达式整理

    整理一些常见的正则表达式(附可视化链接) 数字相关 字符串相关 密码相关 时间相关 其他 判断是否匹配正则判定规则...

  • linux shell正则表达式

    正则 普通正则表达式 扩展正则表达式 普通正则表达式 正则表达式 位置相关的正则^: 表示锚定行首,此字符后面的任...

  • 手机号.邮箱.身份证等相关正则表达式

    主要是对NSString的扩展验证相关 ///////////////////////////// 正则表达式相关...

  • iOS-正则表达式使用

    正则表达式与NSPredicate连用 正则表达式类 分组的使用 相关资料 常用正则表达式

  • Android常用的一些正则校验

    整理一部分常用相关正则

网友评论

      本文标题:正则相关

      本文链接:https://www.haomeiwen.com/subject/xacyyftx.html