Java:正则表达式应用案例讲解

发布时间:2024年01月22日

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

package com.itheima.d2_regex;

import java.util.Scanner;

public class RegexTest3 {
    public static void main(String[] args) {
        //checkPhone();
        checkEmail();
    }
    public static void checkPhone(){
        while (true) {
            System.out.println("请输入您的电话号码:");
            Scanner sc = new Scanner(System.in);
            String phone = sc.nextLine();
            //正常手机号   座机   18676....   010-3424242424 区号3-8位和真正的号码5-20位    0104644535         多种情况
            // regex:
            // 手机号:开头应该是1,第二位3-9,没见过第二位是2的,后面接9位数字
            // 座机号:开头是0,一般0后面还有2-7位数,-?,这个有的号码没有横杠,所以要用?代表出现0或者1次,之后(横杠后只能是1-9,没见过010-0开头的),
            // 后面数就可以任意4-19位了。

            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("您输入的号码不格式正确");
            }
        }

    }
    public static void checkEmail(){
        while (true) {
            System.out.println("请输入您的邮箱:");
            Scanner sc = new Scanner(System.in);
            String email = sc.nextLine();
            //邮箱长什么样?
            //dleo15465@163.com
            //2024561255@qq.com
            //itheima@itcast.com.cn
            //regex:
            //@前大小写数字都可以,@之后一般是公司域名,适当给点长度({2,20}),要用\\.转义,最后要加{1,2},也就是出现一次或者两次
            //(一次例如:.com)  (两次例如:  .com.cn)等等。
            if (email.matches("\\w{2,}@\\w{2,20}(\\.\\w{2,10}){1,2}")){
                System.out.println("您输入的邮箱格式正确");
                break;
            }else {
                System.out.println("您输入的邮箱不格式正确");
            }
        }

    }
}

需求2:使用正则表达式查找一段文本的内容

定义正则表达式时,因为上面写过手机号和邮箱的正则表达式了,下面只需要多加一个热线电话的

正则表达式,拼接一下即可。

最主要的是掌握其中查找信息的步骤和方法。

package com.itheima.d2_regex;

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

public class RegexTest4 {
    public static void main(String[] args) {
    method1();
        //输出:
        //18699997777
        //boniu@itcast.cn
        //01036517895
        //010-98951256
        //bozai@itcast.cn
        //dlei0009@163.com
        //400-618-9090
        //400-618-4000
        //4006184000
        //4006189090
    }
    public 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()){
            //matcher.find()返回boolean类型
            String res = matcher.group();
            System.out.println(res);
        }
    }
}

搜索替换和分割内容

String类提供的方法也在文中:

package com.itheima.d2_regex;

import java.util.Arrays;

public class RegexTest6 {
    public static void main(String[] args) {
        // 1、public String replaceAll(String regex , String newStr):按照正则表达式匹配的内容进行替换
        // 需求1:请把 古力娜扎ai8888迪丽热巴999aa5566马尔扎哈fbbfsfs42425卡尔扎巴,中间的非中文字符替换成 “-”
        String s1 = "古力娜扎ai8888迪丽热巴999aa5566马尔扎哈fbbfsfs42425卡尔扎巴";
        System.out.println(s1.replaceAll("\\w+", "-"));

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

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

文章来源:https://blog.csdn.net/m0_74098386/article/details/135650363
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。