正则表达式
概述:
正则表达式其实就是一个匹配规则,用来替换复杂的if结构判断,在Java中,我们经常需要验证一些字符串,是否符合规则, 例如:
在登录页面对于用户输入的密码需要进行一些限制,比如对于登录中SQL注入问题,帐号与密码不匹配却可以正常登录的问题
这里使用正则表达式对密码的字符格式进行限制,比如不能输入双引号以及单引号
//创建Scanner对象
Scanner sc = new Scanner(System.in);
//定义存储密码的字符串变量
String password = null;
//进入死循环
while (true) {
//提示用户进行输入密码
System.out.println("请输入密码:");
//键盘录入
password = sc.nextLine();
//进行判断,不允许输入双引号以及单引号,限制的字符个数为输入的密码字符个数
if (password.matches("[^'|^\"]{" + password.length() + "}")) {
//如果输入的密码字符符合规则就结束死循环
break;
} else {
//若是用户输入的密码不符合要求则进行提示,让用户再次输入密码,直到输入密码符合要求为止
System.out.println("对不起,你的密码中有特殊符号,请重新输入");
}
}
使用正则表达式的好处
eg:不使用正则表达式:下面的程序让用户输入一个手机号码,我们要验证:
- 手机号码必须是11位长度
- 手机号码首位必须为1
- 手机号码第二位必须是3、5、7、8
- 手机号码必须全部是数字
/**
* @author: Cartel
* @date: 2021/4/13 17:15
* @param number
* @return boolean
* */
//定义方法进行判断输入的号码是否符合要求
public static boolean checkNum(String number) {
//- 手机号码必须是11位长度
if (number.length() != 11) {
return false;
}
//- 手机号码首位必须为1
if (number.charAt(0) != '1' ) {
return false;
}
//- 手机号码第二位必须是3、5、7、8
char c = number.charAt(1);
//进行判断是否符合要求
if (!(c == '3' || c == '5' || c == '7' || c == '8')) {
return false;
}
//- 手机号码必须全部是数字
for (int i = 0; i < number.length(); i++) {
char c1 = number.charAt(i);
if (c1 < '0' || c1 > '9') {
return false;
}
}
//如果以上条件都不符合,则表示手机号是符合我们的条件的
return true;
}
对于以上的代码使用if语句进行判断需要进行多次判断,对于实现同样的功能我们使用正则表达式来实现
public static boolean checkNum(String number) {
/**
* 手机号码必须是11位长度
* 正则表达式实现:{11}
*
* 手机号码首位必须为1
* 正则表达式实现:[1]
*
* 手机号码第二位必须是3、5、7、8
* 正则表达式实现:[][3,5,7,8]
*
* 手机号码必须全部是数字
* [0-9]{11}
*
* []:表示一个字符位置
* x{n}:表示恰好恰好有n个字符要符合x规则
*/
//String 类的matches()方法中的参数位置进行填写正则表达式
return number.matches("[1][3|5|7|8][0-9]{9}");
}
通过上方的代码可以明显的看出使用正则表达式的便利,这里再做一点扩展
//使用正则表达式判断开开心心、快快乐乐、高高兴兴等aabb类型字符串 \\1 、\\2是对前面的(.)字符进行标记
System.out.println("开开心心".matches("(.)\\1(.)\\2"));
System.out.println("快快乐乐".matches("(.)\\1(.)\\2"));
System.out.println("高高兴兴".matches("(.)\\1(.)\\2"));
//使用正则表达式判断开心开心、考虑考虑等acac类型字符串
System.out.println("开心开心".matches("(..){2}"));
System.out.println("考虑考虑".matches("(..){2}"));
//使用正则表达式判断开心开、考虑考等aca类型字符串 \\1 、\\2是对前面的(.)字符进行标记,{0}表示前面的(.)再出现0次
//对于开开心心类型的正则表达式"(.)\\1(.)\\2" 完整格式是"(.)\\1{1}(.)\\2{1}" {1}表示前面的(.)再出现1次,只不过这里的{1}是默认的,可以省略不写
System.out.println("开心开".matches("(.)\\1{0}(.)\\2{0}(.)\\1{0}"));
System.out.println("考虑考".matches("(.)\\1{0}(.)\\2{0}(.)\\1{0}"));
正则表达式-字符类
-
语法示例: 表示匹配单个字符 ^ 取反 - 范围
-
[abc]:代表a或者b,或者c字符中的一个。
-
[^abc]:代表除a,b,c以外的任何字符。
-
[a-z]:代表a-z的所有小写字符中的一个。 左右包含
-
[A-Z]:代表A-Z的所有大写字符中的一个。
-
[0-9]:代表0-9之间的某一个数字字符。
-
[a-zA-Z0-9]:代表a-z或者A-Z或者0-9之间的任意一个字符。
-
[a-dm-p]:a 到 d 或 m 到 p之间的任意一个字符。
-
正则表达式-逻辑运算符
- &&:并且
- | :或者
正则表达式-预定义字符
- 语法示例:
- “.” : 匹配任何字符。如果要表示一个字符点,那么就得使用
\\.
- “\d”:任何数字[0-9]的简写;
- “\D”:任何非数字[^0-9]的简写;
- “\s”: 空白字符:[ \t\n\x0B\f\r] 的简写
- “\S”: 非空白字符:[^\s] 的简写
- “\w”:单词字符:[a-zA-Z_0-9]的简写
- “\W”:非单词字符:[^\w]
- “.” : 匹配任何字符。如果要表示一个字符点,那么就得使用
正则表达式-数量词
- 语法示例:
- X? : 0次或1次
- X* : 0次到多次
- X+ : 1次或多次
- X{n} : 恰好n次
- X{n,} : 至少n次,包含n
- X{n,m}: n到m次(n和m都是包含的)