首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【愚公系列】Java教学课程 042-正则表达式

【愚公系列】Java教学课程 042-正则表达式

作者头像
愚公搬代码
发布2025-06-01 12:33:24
发布2025-06-01 12:33:24
1480
举报
文章被收录于专栏:历史专栏历史专栏

🏆 作者简介,愚公搬代码 🏆《头衔》:华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,阿里云专家博主,腾讯云优秀博主,掘金优秀博主,51CTO博客专家等。 🏆《近期荣誉》:2022年CSDN博客之星TOP2,2022年华为云十佳博主等。 🏆《博客内容》:.NET、Java、Python、Go、Node、前端、IOS、Android、鸿蒙、Linux、物联网、网络安全、大数据、人工智能、U3D游戏、小程序等相关领域知识。

🚀前言

正则表达式(Regular Expression,简称Regex或RegExp)是一个用来描述、匹配、搜索某个文本或字符串的规则或模式。它通常由一些特定的字符和操作符组成,可以用来匹配和过滤各种文本信息。正则表达式可以用于实现文本的查找、替换、过滤、验证等操作,是编程和数据处理领域中非常有用的工具。

🚀一、正则表达式

🔎1.初体验

在Java中,可以使用正则表达式来匹配QQ号码。QQ号码的规则是:不以0开头的数字串。

以下是匹配QQ号码的示例代码:

代码语言:javascript
复制
public static void main(String[] args) {
    System.out.println(checkQQ("2324224c"));
    System.out.println(checkQQ("2324224"));


    System.out.println(checkQQ2("2324224c"));
    System.out.println(checkQQ2("2324224"));
}

public static boolean checkQQ2(String qq){
    return qq != null && !qq.startsWith("0") && qq.matches("\\d{6,20}");
}

public static boolean checkQQ(String qq){
    // 1、判断qq是否为null,以及是否不满足6位以上。 不能以0开始。
    if(qq == null || qq.length() < 6 || qq.length() > 20 || qq.startsWith("0")) {
        return false;
    }

    // 2、必须全部是数字 遍历qq号码中的每个字符    323a242442
    for (int i = 0; i < qq.length(); i++) {
        char ch = qq.charAt(i);
        // 3、判断这个字符是否是非数字
        if(ch < '0' || ch > '9') {
            return false;
        }
    }

    // 4、返回正确
    return true;

}

🔎2.匹配规则

匹配规则简单案例:

代码语言:javascript
复制
public static void main(String[] args) {
    //public boolean matches(String regex):判断是否与正则表达式匹配,匹配返回true
    // 只能是 a  b  c
    System.out.println("a".matches("[abc]")); // true
    System.out.println("z".matches("[abc]")); // false

    // 不能出现a  b  c
    System.out.println("a".matches("[^abc]")); // false
    System.out.println("z".matches("[^abc]")); // true
    System.out.println("a".matches("\\d")); // false
    System.out.println("3".matches("\\d"));  // true
    System.out.println("333".matches("\\d")); // false 每次只能匹配一个字符!

    System.out.println("z".matches("\\w")); // true
    System.out.println("2".matches("\\w"));// true
    System.out.println("21".matches("\\w")); // false
    System.out.println("你".matches("\\w")); // false
    System.out.println("你".matches("\\W")); // true
    System.out.println("---------------------------------");
    //  以上正则匹配只能校验单个字符。

    // 校验密码
    // 必须是数字 字母 下划线 至少 6位
    System.out.println("242dxf_33".matches("\\w{6,}"));
    System.out.println("243".matches("\\w{6,}"));

    // 验证码 必须是数字和字符  必须是4位
    System.out.println("23dA".matches("[\\w&&[^_]]{4}"));
    System.out.println("2_dA".matches("[\\w&&[^_]]{4}"));
    System.out.println("24dA".matches("[a-zA-Z0-9]{4}"));
    System.out.println("2_dA".matches("[a-zA-Z0-9]{4}"));
}

由此案例可汇总以下匹配规则

🦋2.1 字符类(默认匹配一个字符)

匹配

规则

[abc]

只能是a, b, 或c

[^abc]

除了a, b, c之外的任何字符

[a-zA-Z]

a到z A到Z,包括(范围)

[a-d[m-p]]

a到d,或m通过p:([a-dm-p]联合)

[a-z&&[def]]

d, e, 或f(交集)

[a-z&&[^bc]]

a到z,除了b和c:([ad-z]减法)

[a-z&&[^m-p]]

a到z,除了m到p:([a-lq-z]减法)

🦋2.2 预定义的字符类(默认匹配一个字符)

匹配

规则

.

任何字符

\d

一个数字: [0-9]

\D

非数字: [^0-9]

\s

一个空白字符: [ \t\n\x0B\f\r]

\S

非空白字符: [^\s]

\w

[a-zA-Z_0-9] 英文、数字、下划线

\W

[^\w] 一个非单词字符

🦋2.3 贪婪的量词(配合匹配多个字符)

匹配

规则

X?

X , 一次或根本不

X*

X,零次或多次

X+

X , 一次或多次

X {n}

X,正好n次

X {n, }

X,至少n次

X {n,m}

X,至少n但不超过m次

🦋2.4 其他匹配

Java中的正则表达式支持分组匹配、反向引用匹配、零宽度断言匹配和注释匹配。下面分别介绍和示例:

  1. 分组匹配:

分组匹配使用圆括号 () 将一组正则表达式进行分组,方便进行重复匹配或逻辑操作。分组匹配可以使用在量词、跟随限定符和替换等场景。

示例:

代码语言:javascript
复制
String regex = "(\\d{3})-(\\d{4})-(\\d{4})";
String str = "电话号码:010-1234-5678";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(str);
while (matcher.find()) {
    String phoneNumber = matcher.group();
    String areaCode = matcher.group(1);
    String prefix = matcher.group(2);
    String lineNum = matcher.group(3);
    System.out.println("电话号码:" + phoneNumber + ", 区号:" + areaCode + ", 前缀:" + prefix + ", 号码:" + lineNum);
}

输出:

代码语言:javascript
复制
电话号码:010-1234-5678, 区号:010, 前缀:1234, 号码:5678
  1. 反向引用匹配:

反向引用匹配使用反斜杠 \ 将已匹配的字符引用到后面的正则表达式中。反向引用可以用于查找连续出现的相同的字符等情况。

示例:

代码语言:javascript
复制
String regex = "(.)\\1+";
String str = "aaabccccddeee";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(str);
while (matcher.find()) {
    System.out.println("重复字符:" + matcher.group());
}

输出:

代码语言:javascript
复制
重复字符:aaa
重复字符:ccc
重复字符:eee
  1. 零宽度断言匹配:

零宽度断言匹配使用特殊字符对匹配的位置进行限制,但不会将断言的字符包含在匹配的结果中。零宽度断言分为正向先行断言、负向先行断言、正向后行断言和负向后行断言四种类型。

示例:

代码语言:javascript
复制
String regex = "(?<=\\$)\\d+(?=\\$)";
String str = "原价:$1000,折扣价:$800";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(str);
while (matcher.find()) {
    System.out.println("折扣价:" + matcher.group());
}

输出:

代码语言:javascript
复制
折扣价:800
  1. 注释匹配:

注释匹配使用 (?#comment) 进行注释,提高正则表达式的可读性。

示例:

代码语言:javascript
复制
String regex = "\\d{3}-\\d{4}-(?#ignore)\\d{4}";  // 忽略最后四位
String str = "电话号码:010-1234-5678";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(str);
while (matcher.find()) {
    System.out.println("电话号码:" + matcher.group());
}

输出:

代码语言:javascript
复制
电话号码:010-1234

🔎3.案例

🦋3.1 正则表达式在方法中的应用
代码语言:javascript
复制
/**
    目标:正则表达式在方法中的应用。
        String类的方法:
        public String[] split(String regex):
            -- 按照正则表达式匹配的内容进行分割字符串,反回一个字符串数组。
        public String replaceAll(String regex,String newStr)
            -- 按照正则表达式匹配的内容进行替换
 */
public class RegexDemo {
    public static void main(String[] args) {
        String names = "小路dhdfhdf342蓉儿43fdffdfbjdfaf小何";

        String[] nameArr = names.split("\\w+");
        for (int i = 0; i < nameArr.length; i++) {
            System.out.println(nameArr[i]);
        }

        String result = names.replaceAll("\\w+", "lv");
        System.out.println(result);
    }
}
🦋3.2 爬取信息中的电话
代码语言:javascript
复制
/**
    拓展:正则表达式爬取信息中的内容。(了解)
 */
public class RegexDemo {
    public static void main(String[] args) {
        String rs = "学习Java,电话020-43422424,或者联系邮箱" +
                "itcast@itcast.cn,电话18762832633,0203232323" +
                "邮箱bozai@itcast.cn,400-100-3233 ,4001003232";

        // 需求:从上面的内容中爬取出 电话号码和邮箱。
        // 1、设计爬取规则对象
        Pattern p = Pattern.compile("(0\\d{2,7}-?\\d{5,20})|(\\w{2,30}@\\w{2,20}(\\.\\w{2,10}){1,2})|(1[3-9]\\d{9})");

        // 2、得到一个匹配器对象:集合爬取规则,内容。
        Matcher m = p.matcher(rs);

        // 3、开始爬取内容输出
        while (m.find()) {
            System.out.println(m.group());
        }

    }
}
🦋3.3 爬取信息中的电话
代码语言:javascript
复制
/**
     目标:使用正则表达式解决一些问题
 */
public class RegexTest {
    public static void main(String[] args) {
       // checkPhone();
        // checkEmail();
        checkTel();
    }

    public  static void checkTel() {
        // 1、电话
        while (true) {
            Scanner sc = new Scanner(System.in);
            System.out.println("输入号码:");
            String email = sc.next();

            // 2、使用正则表达式校验
            // 020-2324242 02122442 027-42424 0712-3242434
            if(email.matches("0\\d{2,7}-?\\d{5,20}")){
                System.out.println("号码没有毛病~~");
                break;
            }else {
                System.out.println("你输入的号码有问题~");
            }
        }
    }


    public  static void checkEmail() {
        // 2、邮箱
        while (true) {
            Scanner sc = new Scanner(System.in);
            System.out.println("输入邮箱号码:");
            String email = sc.next();

            // 2、使用正则表达式校验
            // 3232323@qq.com  xulei@itcast.cnn  dlei0009@163.com  dlei0009@pci.com.cn
            if(email.matches("\\w{2,30}@\\w{2,20}(\\.\\w{2,10}){1,2}")){
                System.out.println("邮箱号码没有毛病~~");
                break;
            }else {
                System.out.println("你输入的号码有问题~");
            }
        }
    }

    public static void checkPhone(){
        // 3、手机号码
        while (true) {
            Scanner sc = new Scanner(System.in);
            System.out.println("输入手机号码:");
            String phone = sc.next();

            // 2、使用正则表达式校验手机号码的格式
            // 18667676520
            if(phone.matches("1[3-9]\\d{9}")){
                System.out.println("手机号码没有毛病~~");
                break;
            }else {
                System.out.println("你输入的手机号码有问题~");
            }
        }
    }
}

🚀感谢:给读者的一封信

亲爱的读者,

我在这篇文章中投入了大量的心血和时间,希望为您提供有价值的内容。这篇文章包含了深入的研究和个人经验,我相信这些信息对您非常有帮助。

如果您觉得这篇文章对您有所帮助,我诚恳地请求您考虑赞赏1元钱的支持。这个金额不会对您的财务状况造成负担,但它会对我继续创作高质量的内容产生积极的影响。

我之所以写这篇文章,是因为我热爱分享有用的知识和见解。您的支持将帮助我继续这个使命,也鼓励我花更多的时间和精力创作更多有价值的内容。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-01-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 🚀前言
  • 🚀一、正则表达式
    • 🔎1.初体验
    • 🔎2.匹配规则
      • 🦋2.1 字符类(默认匹配一个字符)
      • 🦋2.2 预定义的字符类(默认匹配一个字符)
      • 🦋2.3 贪婪的量词(配合匹配多个字符)
      • 🦋2.4 其他匹配
    • 🔎3.案例
      • 🦋3.1 正则表达式在方法中的应用
      • 🦋3.2 爬取信息中的电话
      • 🦋3.3 爬取信息中的电话
  • 🚀感谢:给读者的一封信
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档