正则表达式
正则表达式概述、初体验
- 正则表达式可以用一些规定的字符来制定规则,并用来校验数据格式的合法性
案例:
- 需求:假如现在要求校验一个qq号码是否正确,6位及20位之内,必须全部是数字
传统做法:
public static boolean Checkqq(String qq){
//1.不满足条件的先过滤掉
if (qq == null || qq.length() < 6 || qq.length() > 20){
return false;
}
//2.判断是否全部是数字 并且长度是 6-20位
for (int i = 0; i < qq.length(); i++) {
char ch = qq.charAt(i);
if (ch <'0' || ch > '9'){
return false;
}
}
return true;
}
利用正则表达式:
public static boolean Checkqq2(String qq){
return (qq != null) && qq.matches("\\d{6,20}");
}
由此可以看出,正则表达式是要比传统方式简洁很多。
正则表达式的匹配规则
字符类 (默认匹配一个字符)
[abc] ------ 只能是a b c
[ ^abc] ----- 除了a,b,c之外的任何字符[a-zA-Z] ------ a到z A到Z ,包括(范围)
[a-d[m-p]] ------ a到d,或m到p
[a-z&&[def]] ------- d,e,或f(交集)
[a-z&&[ ^bc]] ------- a到z,除了b和c
[a-z&&[ ^ m-p]] ------- a到z,除了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? ------- X,一次或根本不
X* ------- X,零次或多次
X+ ------- X,一次或多次
x[n] ------- X,正好n次
X[n,] ------- X,至少n次
X[n,m] ------- X,至少n但不超过m次
字符串对象提供了匹配正则表达式规则的API
public boolean matches(String regex) : 判断是否匹配正则表达式,匹配返回true,不匹配返回false
单个字符的匹配
//用 a 去匹配 abc 三个中的一个 [abc]意思是a或者b或者c
System.out.println("a".matches("[abc]")); //true
//用 z 去匹配 abc 三个中的一个
System.out.println("z".matches("[abc]")); //false
//用 ab 去匹配 abc
System.out.println("ab".matches("[abc]")); //false
//用 a 去匹配 abc中的一个 [abc]+的意思是a可以出现多次
System.out.println("a".matches("[abc]+")); //true
//以下正则匹配只能校验单个字符
//[^abc] 除了abc之外的字符
System.out.println("a".matches("[^abc]")); //false
System.out.println(".".matches("[^abc]")); //true
//[abc]是 a 或 b 或 c 中的一个
System.out.println("z".matches("[abc]")); //false
// \\d 表示全部是数字
System.out.println("1".matches("\\d")); //true
System.out.println("555".matches("\\d")); //false
// \\w 表示字母数字下划线
System.out.println("zz".matches("\\w")); //false
System.out.println("2_".matches("\\w")); //false
System.out.println("你".matches("\\w")); //false
匹配多位字符
//校验密码 (多位字符的校验)
//必须是 数字 字母 下划线 至少6位
// \\w{6,}是指 字母数字下划线并且至少6位
System.out.println("123457yyy".matches("\\w{6,}")); //true
System.out.println("12345".matches("\\w{6,}")); //false
System.out.println("123457yyy".matches("\\w{6}")); //false
System.out.println("hsahlsjasj你".matches("\\w{6,}")); //false
//验证 必须是 数字和字符 必须是4位
// [a-zA-Z0-9]{4} 表示由字母数字下划线组成并且长度只能是4位
System.out.println("sg56".matches("[a-zA-Z0-9]{4}")); //true
System.out.println("sg5>".matches("[a-zA-Z0-9]{4}")); //false
System.out.println("sg562".matches("[a-zA-Z0-9]{4}")); //false
System.out.println("shs1".matches("[\\w &&[^_]]{4}")); //true
System.out.println("shsha".matches("[\\w &&[^_]]{4}")); //false
正则表达式的常见案例
需求
- 请编写程序模拟用户输入手机号码、验证格式正确,并给出提示,直到格式输入正确为止
- 请编写程序模拟用户输入邮箱号码、验证格式正确,并给出提示,直到格式输入正确为止
- 请编写程序模拟用户输入电话号码、验证格式正确,并给出提示,直到格式输入正确为止
//正则表达式验证手机号码格式是否正确 正确给出提示 错误 继续输入
public static void checkPhone(){
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("请输入手机号码:");
String phone = sc.next();
//开始用正则表达式判断
// "1[3-9]\\d{9}" 第一位是1开头,第二位不能是1和2,也就是3-9之间的数字,后面的全都是数字,并且长度是9位
if (phone.matches("1[3-9]\\d{9}")){
System.out.println("格式正确");
break;
}else{
System.out.println("格式有误 请重新输入");
}
}
}
//正则表达式 验证邮箱格式是否正确
public static void checkEmainl(){
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("请输入邮箱号码:");
String email = sc.next();
//邮箱格式 32522552226@qq.com
// yhb228572@163.com
// \\w{1,30}表示邮箱前面的内容可以是字母数字下划线长度是1到30位, [a-zA-Z0-9]{2,20}表示@后面.前面的内容可以是字母数字,并且长度是2到20位, (\\.[a-zA-Z0-9]{2,20}){1,2})表示.后的内容可以出现1到2次
if (email.matches("\\w{1,30}@[a-zA-Z0-9]{2,20}(\\.[a-zA-Z0-9]{2,20}){1,2}")){
System.out.println("邮箱格式输入成功,注册成功");
break;
}else{
System.out.println("输入邮箱格式有误,请重新输入");
}
}
}
//正则表达式 验证电话号码格式是否正确
public static void checkTel(){
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("请输入电话号码:");
String mytel = sc.next();
// "0\\d{2,6}-?\\d{5,20}"表示0开头,区号是2到6位并且全部是数字,-?表示-可以有也可以没有,\\d{5,20}表示后面的数字位数是5-20位
if (mytel.matches("0\\d{2,6}-?\\d{5,20}")){
System.out.println("电话输入成功,注册成功");
break;
}else{
System.out.println("您的输入有误,请重新输入");
}
}
}
//校验金额是否正确 12 2.5 0.52 都是正确的
public static void checkMoney(){
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("请输入金额:");
String money = sc.next();
if(money.matches("\\d{1,}\\.?\\d{1,}")){
System.out.println("输入成功,您的余额是"+money);
break;
}else{
System.out.println("您输入的金额有误,请重新输入");
}
}
}
正则表达式在方法中的应用
正则表达式在字符串方法中的应用
方法名 | 说明 |
---|---|
public String replaceAll(String regex,String newStr) | 按照正则表达式匹配的内容进行替换 |
public String[] split(String regex) | 按照正则表达式匹配的内容进行分割字符串,返回一个字符串数组 |
/*
public String[] split(String regex)
--按照正则表达式匹配的内容进行分割字符串 返回一个字符串数组
public String replaceAll(String regex,String newStr)
--按照正则表达式匹配的内容进行替换
*/
String names = "小明shsh_s6s6jaalhsj小胡shja_ss88hsjasaj张三";
String[] arr = names.split("\\w+");
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
String name = names.replaceAll("\\w+"," ");
System.out.println(name);
正则表达式爬取信息
String str = "一起来学习Java,学习Java使我快乐,电话是13234567654,留下你的邮箱," +
"shuab@ssj.cn,电话16787656785,02367546543" +
"邮箱baosia@hga.cn,400-100-3424,40018879876";
//需求:从上面的内容中爬取出,电话号码和邮箱
//1.定义爬取规则,字符串形状
String regex = "(\\w{1,30}@[a-zA-Z0-9]{2,20}(\\.[a-zA-Z0-9]{2,20}){1,2})|" +
"(1[3-9]\\d{9})|(0\\d{2,6}-?\\d{5,20})|(400-?\\d{3,9}-?\\d{3,9})";
//2.把这个爬取规则编译成匹配对象
Pattern pattern = Pattern.compile(regex);
//3.得到一个内容匹配器对象
Matcher matcher = pattern.matcher(str);
//4.开始找内容
while(matcher.find()){
String rs1 =matcher.group();
System.out.println(rs1);
}