概念
matches方法是字符串提供的方法,是可以让字符串对象与送进来的正则表达式进行匹配,如果匹配成功则返回true,反之返回false。
初体验
public class RegexTest1 {
public static void main(String[] args) {
System.out.println(checkQQ(null));
System.out.println(checkQQ("1008611011"));
System.out.println(checkQQ("100861weq11"));
System.out.println("------------------------------------------");
System.out.println(checkQQ1(null));
System.out.println(checkQQ1("1008611011"));
System.out.println(checkQQ1("100861weq11"));
}
//使用正则表达式
public static boolean checkQQ1(String qq){
return qq != null && qq.matches("[1-9]\\d{5,19}");//(反斜杠\\d)\\d代表全部要是数字
//qq号码的第一位必须是1-9之间的数字不能是0,
// 剩下的数字用(反斜杠反斜杠)\\d代表剩下的数字,位数用(大括号){5-19},和第一位加起来就是6-20之间
}
public static boolean checkQQ(String qq) {
//1.判断qq号码是否为null
if (qq == null || qq.startsWith("0") || qq.length() < 6 || qq.length() > 20) {
return false;
}
//2.满足以上条件之后,判断qq号码是不是都是数字
//遍历里面每一个字符,只要里面有一个不是数字,那就说明不满足要求
for (int i = 0; i < qq.length(); i++) {
//根据索引提取当前位置处的字符
char ch = qq.charAt(i);//根据索引提取字符
//判断ch记住的字符,如果不是数字,qq号码就不合法
if (ch < '0' || ch > '9'){
return false;
}
}
//3.程序走到这里,说明qq号是合法的,前面不满足条件的都被拦截了
return true;
}
}
书写规则
代码演示:
注意点:在java中\(一个反斜杠)是有特殊用途(意义)的,例如\n , \t 整体被当作一个字符看分别表示换行、缩进,同理如果在使用正则表达式时候写\d(一个反斜杠d)会被当做一个整体看待,但是由于没有\d这个字符,就会报错;如果就希望把\(一个反斜杠)当反斜杠看待,要告诉他这个反斜杠就是个杠(比较绕),需要再在\前面加一个\(反斜杠),再最后和d在一起才会是真正意义上的\d。 (而不把\d当作一个整体来解析,会当成一个\d来解析)所以在使用时候需要转义!
总结:
应用案例
需求:
校验用户输入的电话、邮箱、时间是否合法
import java.util.Scanner;
public class RegexTest3 {
public static void main(String[] args) {
checkPhone();
checkEmile();
checkTime();
}
private static void checkPhone() {
while (true) {//将这段代码ctrl+alt+t放在一段死循环中(while(true))
System.out.println("请输入您的电话号码(手机或座机):");
Scanner sc = new Scanner(System.in);//用户输入
String phone = sc.nextLine();//接收一行数据,代表接收一行用户输入的号码
//phone变量里面就是记住用户输入的号码,再调用matches方法("校验号码的正则表达式")
//用户输入的号码可能是:手机号1324749832/座机号010-2222222 0102222222
if (phone.matches("(1[3-9]\\d{9})|(0\\d{2,7}-?[1-9]\\d{4,19})")) {
System.out.println("您输入的号码格式正确。");
break;//如果输入的号码与正则表达式匹配的成功了就跳出循环
} else {
System.out.println("您输入的号码格式错误,请重新输入:");
}
}
}
private static void checkEmile() {
while (true) {
System.out.println("请输入您的邮箱:");
Scanner sc = new Scanner(System.in);
String emile = sc.nextLine();//接收一行数据,代表接收一行用户输入的邮箱
//emile变量里面就是记住用户输入的邮箱,再调用matches方法("校验邮箱的正则表达式")
/**
* daw190310@163.com
* 1738842@qq.com
* itheima@itcast.com.cn
*/
//\\w数字字母下划线 (. ---> \\.)
//(\.\w{2,10}){1,2}表示后面域名可以出现一次或两次
if (emile.matches("\\w{2,}@\\w{2,20}(\\.\\w{2,10}){1,2}")) {
System.out.println("您输入的邮箱格式正确。");
break;
} else {
System.out.println("您输入的邮箱格式错误,请重新输入:");
}
}
}
private static void checkTime() {
while (true) {
System.out.println("请您输入时间:");
Scanner sc = new Scanner(System.in);
String time = sc.nextLine();//接收一行数据,代表接收一行用户输入的时间
//time变量里面就是记住用户输入的邮箱,再调用matches方法("校验时间的正则表达式")
/**
* 2023-10-1 12:24:43
* 2023-10-1
* 12:23:34
* 10-1 12:21
*/
//\d*-\d[1-12]-\d[1-31] \d[1-24](:\d[00-59]){1,2}自己没写完 发现想得出来写不出来
if (time.matches("^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)\\s+([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$")) {
System.out.println("您输入的时间格式正确。");
break;
} else {
System.out.println("您输入的时间格式错误,请重新输入:");
}
}
}
}
用于查找信息
作用一:用来校验数据格式是否合法
作用二:在一段文本中查找满足要求的内容