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

根据上图,我们将密码设置规则可以描述为两个条件:
(1)长度为6-16位;
(2)密码中必须包含数字,大写字母,小写字母,特殊字符(指定字符);
/**
* 校验用户密码是否满足设置规则
*
* @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的。
下面,则是具有相同校验功能,基于正则表达式的验证方法:
/**
* 通过正则表达式校验用户密码是否满足设置规则
*
* @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之外的所有字符,都可以满足。

浙公网安备 33010602011771号