正则表达式

案例引入

你可能有过这样的经历:我们去某些网站注册帐号,当你在设置密码的时候,网站会提示你密码的长度范围,以及对应的规则限制(如下图)。

 

 

 

 

 

根据上图,我们将密码设置规则可以描述为两个条件:

(1)长度为6-16位;

(2)密码中必须包含数字,大写字母,小写字母,特殊字符(指定字符);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
/**
 * 校验用户密码是否满足设置规则
 *
 * @param password 用户输入的密码
 * @return true-满足;false-不满足
 */
public static boolean checkPassword(String password) {
    // 密码不能为空
    if (password == null || password.isEmpty()) {
        return false;
    }
    // 校验密码长度(6-16位)
    int len = password.length();
    if (len < 6 || len > 16) {
        return false;
    }
    // 定义四种组合条件
    boolean hasNumber = false;
    boolean hasSmallLetter = false;
    boolean hasBigLetter = false;
    boolean hasSpecialChar = false;
    // 将密码字符串拆分为单个字符,然后对每个字符进行校验
    char[] chars = password.toCharArray();
    for (char c : chars) {
        // 是否包含数字0-9
        if (c >= '0' && c <= '9') {
            hasNumber = true;
            continue;
        }
        // 是否包含小写字母a-z
        if (c >= 'a' && c <= 'z') {
            hasSmallLetter = true;
            continue;
        }
        // 是否包含大写字母A-Z
        if (c >= 'A' && c <= 'Z') {
            hasBigLetter = true;
            continue;
        }
        // 是否满足指定的特殊字符
        if ("~@#S%*_-+=:.?".indexOf(c) > 0) {
            hasSpecialChar = true;
            continue;
        }
        // 如果某个字符不在上面四种情况,则不满足规则
        return false;
    }
    // 如果四种组合条件均满足,则符合密码设置规则
    return hasNumber && hasSmallLetter && hasBigLetter && hasSpecialChar;
}

  

 

  可以看到,我们列举的8组密码,都得到了验证,说明我们的方法是OK的。

下面,则是具有相同校验功能,基于正则表达式的验证方法:

1
2
3
4
5
6
7
8
9
/**
 * 通过正则表达式校验用户密码是否满足设置规则
 *
 * @param password 用户输入的密码
 * @return true-满足;false-不满足
 */
public static boolean checkPasswordByRegex(String password) {
    return Pattern.matches("^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[~@#S%*_\\-+=:.?])[A-Za-z0-9~@#S%*_\\-+=:.?]{8,20}$", password);
}

  

 

 

 通过结果我们可以看到,他也是符合我们预期的。于是我们发现,在不用正则表达式的时候,我们的代码量近30行,而使用了正则表达式,代码就浓缩为了1行,也就是说,使用正则表达式时可以简化我们的代码。

正则:\d 

\d 表示一个数字。

如:

aaa\d: 表示验证的字符串后面必须以 aaa 开头,且以一个数字结尾。

 

 

 aaa\dbbb:aaa和bbb中间有一个数字

 

  正则:\D

\D 表示一个非数字,它和上面 \d 的意思恰好相反。

如:

\D\D\D: 则表示一个长度为3,不包含数字的字符串。

 

 正则:\w

\w 表示一个字母(大小写均可)、数字,或下划线。

如:

12\w45:则表示12和45中间必须是一个字母,数字,或下划线。

 

 

正则:| 

| (竖线) 则表示或的关系,表示检测的字符串须满足其中一个时,才符合条件。

如:

aa|bb|cc:则表示输入的字符串须是aa,或bb,或cc其中的一个。

 

 

正则:[abc]

[ ] 表示匹配其中任意一个字符。

如: 

a[bcd]e:则表示a和e的中间须是b,或c,或d其中的一个

 

 

正则:[^abc]

[^ ] 表示不与中括号里的任意字符匹配。

如: 

a[^bcd]e:则表示a和e的中间除b,c,d这三个字符外,其他的字符都满足。

 正则:[a-z]

[值1-值2] 则表示值1到值2中间的所有字符都满足(包括值1和值2)。常用该正则来表示大小写字母范围,数字范围。

正则:[^a-z]

[^值1-值2] 则表示除值1和值2之外的所有字符,都可以满足。

 

posted @   周—  阅读(82)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· SpringCloud带你走进微服务的世界
点击右上角即可分享
微信分享提示