【黑马Java基础】正则表达式+异常

正则表达式

概念

就是由一些特定的字符组成,代表的是一个规则

作用:

  • 用来校验数据格式是否合法(更简洁,更便捷)
  • 在一段文本中查找满足要求的内容

以下这段代码checkQQ1中的一行正则表达式代码,完成checkQQ里一堆代码所能实现的功能,这就是正则表达式。

package regex;

public class RegexTest1 {
    public static void main(String[] args) {
        System.out.println(checkQQ(null));
        System.out.println(checkQQ("123456jhgf56"));
        System.out.println(checkQQ("1234567895"));
        System.out.println("------------------------------------");

        System.out.println(checkQQ1(null));
        System.out.println(checkQQ1("123456jhgf56"));
        System.out.println(checkQQ1("1234567895"));
    }

    public static boolean checkQQ1(String qq){
        return qq != null && qq.matches("[1-9]\\d{5,19}");
        // 在这里:[1-9]的意思是首位必须是1-9,\\d{5,19}的意思是剩余有5-19位
    }

    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至少不是空,不是以0开头的,满足6-20之间的长度
        //判断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;
    }
}

//输出:
false
false
true
------------------------------------
false
false
true

书写规则

https://doc.qzxdp.cn/jdk/17/zh/api/java.base/java/util/regex/Pattern.html

在这里插入图片描述

每次只能匹配单个字符

预定义字符:
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

应用案例1:校验数据合法

需求:校验用户输入的电话、邮箱、时间是否合法

package regex;

import java.util.Scanner;

public class RegexTest3 {
    public static void main(String[] args) {
        checkPhone();
        checkEmail();
        checkTime();
    }

    public static void checkPhone() {
        while (true) {
            System.out.println("输入电话或座机:");
            Scanner sc = new Scanner(System.in);
            String phone = sc.nextLine();

            if(phone.matches("(1[3-9]\\d{9})|(0\\d{2,7}-?[1-9]\\d{4,19})")){
                System.out.println("bingo!");
                break;
            }else {
                System.out.println("fail");
            }
        }
    }

    public static void checkEmail() {
        while (true) {
            System.out.println("输入Email:");
            Scanner sc = new Scanner(System.in);
            String phone = sc.nextLine();

            if(phone.matches("\\w{2,}@\\w{2,20}(\\.\\w{2,10}){1,2}")){
                System.out.println("bingo!");
                break;
            }else {
                System.out.println("fail");
            }
        }
    }

    //不知道对不对
    public static void checkTime() {
        while (true) {
            System.out.println("输入时间:");
            Scanner sc = new Scanner(System.in);
            String phone = sc.nextLine();

            if(phone.matches("(\\d{4})-(\\d{2})-(\\d{2})\\s+(([0-1][0-9])|(2[0-4]):([0-5][0-9]):([0-5][0-9]))")){
                System.out.println("bingo!");
                break;
            }else {
                System.out.println("fail");
            }
        }
    }
    
}

应用案例2:用于查找信息

在一段文本中查找满足要求的内容
在这里插入图片描述

package regex;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexTest4 {
    public static void main(String[] args) {
        method1();
    }

    private static void method1() {
        String data ="来黑马程序员学习Java,\n" +
                    "  电话:1866668888,18699997777 \n" +
                    "  或者联系邮箱:boniu@itcast.cn,\n" +
                    "  座机电话:01036517895,010-98951256\n" +
                    "  邮箱:bozai@itcast.cn,\n" +
                    "  邮箱:dlei0009@163.com,\n"+
                    "  热线电话:400-618-9090 ,400-618-4000,4006184000,4006189090";
        //1、定义爬取规则
        String regex = "((1[3-9]\\d{9})|(0\\d{2,7}-?[1-9]\\d{4,19}))|(\\w{2,}@\\w{2,20}(\\.\\w{2,10}){1,2})"
                + "|(400-?\\d{3,7}-?\\d{3,7})";

        //2、把正则表达式封装成一个Pattern对象
        Pattern pattern = Pattern.compile(regex);

        //3、通过pattern对象去获取查找内容的匹配器对象
        Matcher matcher = pattern.matcher(data);

        //4、定义一个循环开始爬取信息
        while(matcher.find()){
            String rs = matcher.group();   //获取到找到的内容了
            System.out.println(rs);
        }
    }
}

应用案例3:用于搜索替换、分割内容

在这里插入图片描述

需求:
在这里插入图片描述

package regex;

import java.util.Arrays;

public class RegexTest5 {
    public static void main(String[] args) {

        //1、按照正则表达式匹配的内容进行替换
        String s1 = "古力娜扎ai8888迪丽热巴999aa5566马尔扎哈fbbfsfs42425卡尔扎巴";
        System.out.println(s1.replaceAll("\\w+", "-"));

        //1.2、某语音系统,收到一个口吃的人说“我喜欢编编编程程程!”, 需要优化成“我喜欢编程!”
        /*
        (.)一组:.匹配任意字符
        \\1:为这个组声明一个组号:1号
        +:声明必须是重复的字
        $1:可以取到第1组代表那个重复的字
         */
        String s2 = "我喜欢编编编程程程!";
        System.out.println(s2.replaceAll("(.)\\1+", "$1"));

        //2、public String[] split(String regex):按照正则表达式匹配的内容进行分割字符串,返回一个字符串数组
        //需求:把 古力娜扎ai8888迪丽热巴999aa5566马尔扎哈fbbfsfs42425卡尔扎巴 中的人名获取出来
        String s3 ="古力娜扎ai8888迪丽热巴999aa5566马尔扎哈fbbfsfs42425卡尔扎巴";
        String[] names = s3.split("\\w+");
        System.out.println(Arrays.toString(names));

    }
}

异常

异常就是代表程序出现的问题。

实际开发里面,专业的应该使用异常把问题封装后再给出去

认识异常

在这里插入图片描述

SUN公司在处理程序出现的问题时,方法一旦出现问题,方法的内部就会把这个问题的信息封装成一个所谓的异常对象,然后把这个异常对象从这个main方法中抛出去,抛给JVM虚拟机。JVM收到异常对象后,会把程序先停下来,再把异常对象打印出来。打印出来的异常对象里面就会包含该问题的很多信息。

  • 异常的体系有:
    在这里插入图片描述

如果程序遇到编译时异常,想先继续往下写,就要用到:

  • 捕获异常(try catch): 把程序可能出现的异常抓起来。try试图监视 catch捕获。

    try{
        //监视可能出现的异常!
    }catch(异常类型1 变量){
        //处理异常
    }catch(异常类型2 变量){
        //处理异常
    }
    

在这里插入图片描述

  • 抛出异常(throws ParseException):在方法上使用throws关键字,可以将方法内部出现的异常抛出去给调用者处理,也就是找上一层程序抛出
方法 throws 异常1,异常2,异常3..{
    ...
}

在这里插入图片描述

自定义异常

Java无法为这个世界上全部的问题都提供异常类来代表,如果企业自己的某种问题,想通过异常来表示,
以便用异常来管理该问题,那就需要自己来定义异常类了。

  • 自定义异常种类:
    在这里插入图片描述
  1. 自定义运行时异常

在这里插入图片描述

package exception;

public class ExceptionTest1 {
    public static void main(String[] args) {
        //保存一个合法的年龄
        try {
            saveAge(12);
            System.out.println("底层执行成功!");
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("底层出现了bug");
        }
    }

    public static void saveAge(int age){
        if (age>0 && age<150){
            System.out.println("年龄被成功保存:" +age);
        }else {
            //用一个异常对象封装这个问题
            //throw 抛出去这个异常对象
            throw new AgeIllegalRuntimeException("/age is illegal, your age is" + age);
        }
    }

}







package exception;
//1、必须让这个类继承自RuntimeException,才能成为一个运行时异常类
public class AgeIllegalRuntimeException extends RuntimeException{
    public AgeIllegalRuntimeException() {
    }

    public AgeIllegalRuntimeException(String message) {
        super(message);
    }
}

  1. 自定义编译时异常
package exception;

public class ExceptionTest1 {
    public static void main(String[] args) {
        //保存一个合法的年龄
        try {
            saveAge(12);
            System.out.println("底层执行成功!");
        } catch (AgeIllegalException e) {  //
            e.printStackTrace();
            System.out.println("底层出现了bug");
        }
    }

    public static void saveAge(int age) throws AgeIllegalException{   //
        if (age>0 && age<150){
            System.out.println("年龄被成功保存:" +age);
        }else {
            //用一个异常对象封装这个问题
            //throw 抛出去这个异常对象
            //throws用在方法上,抛出方法内部的异常
            throw new AgeIllegalException("/age is illegal, your age is" + age);
        }
    }
}









package exception;
//1、必须让这个类继承自Exception,才能成为一个运行时异常类
public class AgeIllegalException extends Exception{
    public AgeIllegalException() {
    }

    public AgeIllegalException(String message) {
        super(message);
    }
}

如果这个问题很严重,很容易犯,就用编译时异常,反之选运行时异常

异常有什么用?

  • 异常是用来查寻系统bug的关键参考信息
  • 异常可以作为方法内部一种特殊返回值,以便通知上层调用者底层的执行情况

异常的处理

在这里插入图片描述

1、捕获异常,记录异常并响应合适的信息给用户

  • 具体代码
package exception;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class ExceptionTest2 {
    public static void main(String[] args) {
        try {
            test1();
        } catch (FileNotFoundException e) {
            System.out.println("找的文件不存在");
            e.printStackTrace();   //打印出这个异常对象的信息
        } catch (ParseException e) {
            System.out.println("解析的时间有问题");
            e.printStackTrace();    //打印出这个异常对象的信息
        }
    }

    public static void test1() throws FileNotFoundException, ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date d = sdf.parse("2018-11-11 10:24:11");
        System.out.println(d);
        test2();
    }

    public static void test2() throws FileNotFoundException {
        //读取文件
        InputStream is = new FileInputStream("D:/xinjian.txt");
    }
}
  • 2个异常具体怎么执行的:
    在这里插入图片描述

在这里插入图片描述

如何优化?

写法上的优化:由于实际开发中,我们不知道实际执行中有什么异常,所以可以都用Exception,这个父类可以处理所有异常

package exception;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class ExceptionTest2 {
    public static void main(String[] args) {
        try {
            test1();
        } catch (Exception e) {
            System.out.println("您的操作有问题!");
            e.printStackTrace();   //打印出这个异常对象的信息
        }
    }

    public static void test1() throws Exception {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date d = sdf.parse("2018-11-11 10:24:11");
        System.out.println(d);
        test2();
    }

    public static void test2() throws Exception {
        //读取文件
        InputStream is = new FileInputStream("D:/xinjian.txt");

    }
}

2、捕获异常,尝试重新修复

package exception;

import java.util.Scanner;

public class ExceptionTest3 {
    public static void main(String[] args) {
        //需求:调用一个方法,让用户输入一个合适的价格返回为止
        System.out.println(getMoney());

    }

    private static double getMoney() {
        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("输入合适的价格:");
            double money = sc.nextDouble();
            if (money >= 0){
                return money;
            }else {
                System.out.println("输入的不对");
            }
        }

    }
    
}

如果输入字母,会报错、
在这里插入图片描述

现在的代码就比较健壮了:

package exception;

import java.util.Scanner;

public class ExceptionTest3 {
    public static void main(String[] args) {
        //需求:调用一个方法,让用户输入一个合适的价格返回为止
        //尝试修复
        while (true) {
            try {
                System.out.println(getMoney());
                break;
            } catch (Exception e) {
                System.out.println("输入合法的数字!");
            }
        }
    }

    private static double getMoney() {
        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("输入合适的价格:");
            double money = sc.nextDouble();
            if (money >= 0){
                return money;
            }else {
                System.out.println("输入的不对");
            }
        }

    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值