Java中的正则表达式

本文详细介绍了Java中正则表达式的基础知识,包括概述、匹配规则、常见案例及在方法中的应用。通过实例展示了如何使用正则表达式进行数据格式校验,如QQ号码、手机号码和邮箱的验证,以及正则表达式在字符串处理和信息爬取中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

正则表达式

正则表达式概述、初体验

  • 正则表达式可以用一些规定的字符来制定规则,并用来校验数据格式的合法性

案例:

  • 需求:假如现在要求校验一个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);
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RainbowCoder

你的鼓励将是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值