Java中正则表达式的介绍、使用场景及示例代码

一、前言

Java中的正则表达式是一种强大的文本处理工具,它允许你通过特定的模式来匹配、查找、替换或验证字符串。Java的正则表达式功能通过java.util.regex包提供,其中Pattern类表示编译后的正则表达式,而Matcher类则用于对输入字符串进行匹配操作。

二、正则表达式的基础

  • 字符类 ‌:如.(匹配任意字符)、\d(匹配数字)、\w(匹配字母或数字或下划线)等。
  • 数量词 ‌:如*(匹配0次或多次)、+(匹配1次或多次)、?(匹配0次或1次)、{n}(匹配n次)、{n,}(匹配n次或更多次)、{n,m}(匹配n到m次)等。
  • 锚点 ‌:如``(匹配字符串的开始)、$(匹配字符串的结束)、\b(匹配单词边界)等。
  • 分组和捕获 ‌:用()来分组,捕获的组可以通过反向引用进行访问,如\1\2等表示第一、第二个捕获组。
  • 或操作 ‌:用|表示"或"的关系。
  • 转义字符 ‌:在正则表达式中,某些字符具有特殊含义,如果要匹配这些字符本身,需要使用\进行转义,如\.匹配点字符。

三、Java中的正则表达式类

  • Pattern类‌:

    • Pattern.compile(String regex):将给定的正则表达式编译成一个模式。
    • Pattern.matcher(CharSequence input):创建一个匹配器,用于将输入序列与该模式进行匹配。
  • Matcher类‌:

    • boolean matches():尝试将整个区域与模式匹配。
    • boolean lookingAt():尝试从输入序列的开头开始匹配模式。
    • boolean find():尝试在输入序列中查找与该模式匹配的下一个子序列。
    • int start() / int end():返回当前匹配的起始和结束索引。
    • String group() / String group(int group):返回由之前的匹配操作所匹配的输入子序列,或指定组的子序列。

四、常见应用场景

  1. 校验输入‌:使用正则表达式来校验用户输入的格式,如邮箱地址、电话号码、身份证号码等。
  2. 文本搜索‌:在大量文本中搜索符合特定模式的字符串,如查找所有包含特定单词的句子。
  3. 文本替换‌:将文本中符合特定模式的字符串替换为其他字符串,如将文本中的所有数字替换为星号。
  4. 字符串分割‌:根据正则表达式来分割字符串,如将逗号分隔的字符串分割为数组

五、示例代码

以下是一个简单的Java正则表达式示例,用于验证一个字符串是否为有效的电子邮件地址:

java 复制代码
import java.util.regex.Pattern;
import java.util.regex.Matcher;

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

        // 定义电子邮件地址的正则表达式模式
        String regex = "[A-Za-z0-9+_.-]+@[A-Za-z0-9.-]+$";

        // 编译正则表达式
        Pattern pattern = Pattern.compile(regex);

        // 要匹配的输入字符串
        String input = "example@example.com";

        // 创建匹配器
        Matcher matcher = pattern.matcher(input);

        // 进行匹配操作并输出结果
        if (matcher.matches()) {
            System.out.println("有效的电子邮件地址!");
        } else {
            System.out.println("无效的电子邮件地址!");
        }
    }
}

以下是一个简单的示例,演示如何使用Java正则表达式来匹配字符串中的数字:

java 复制代码
import java.util.regex.Matcher;
import java.util.regex.Pattern;

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

        // 定义正则表达式模式
        String regex = "\\d+";

        // 编译正则表达式模式
        Pattern pattern = Pattern.compile(regex);

        // 要匹配的输入字符串
        String input = "The number is 12345 and the other number is 67890.";

        // 获取Matcher对象
        Matcher matcher = pattern.matcher(input);
        
        // 查找并打印所有匹配的数字
        while (matcher.find()) {
            System.out.println("Found number: " + matcher.group());
        }
    }
}

以下是一个简单的示例,演示如何使用Java正则表达式来验证电话号码:

java 复制代码
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class PhoneNumberValidator {
    private static final String PHONE_NUMBER_REGEX = "^1[34578]\\d{9}$";

    public static boolean validatePhoneNumber(String phoneNumber) {
        Pattern pattern = Pattern.compile(PHONE_NUMBER_REGEX);
        Matcher matcher = pattern.matcher(phoneNumber);
        return matcher.matches();
    }

    public static void main(String[] args) {
        String phoneNumber = "13800138000";
        boolean isValid = validatePhoneNumber(phoneNumber);
        System.out.println("电话号码是否有效: " + isValid);
    }
}

以下是一个简单的示例,演示如何使用Java正则表达式来验证身份证号码:

java 复制代码
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class IDCardValidator {

    // 15位身份证正则表达式
    private static final String IDCARD15_REGEX = "^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}$";

    // 18位身份证正则表达式
    private static final String IDCARD18_REGEX = "^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}(\\d|X|x)$";

    public static boolean isValidIDCard(String idCard) {
        Pattern pattern15 = Pattern.compile(IDCARD15_REGEX);
        Pattern pattern18 = Pattern.compile(IDCARD18_REGEX);
        Matcher matcher15 = pattern15.matcher(idCard);
        Matcher matcher18 = pattern18.matcher(idCard);
        return matcher15.matches() || matcher18.matches();
    }

    public static void main(String[] args) {
        String idCard = "11010519491231002X";
        boolean isValid = isValidIDCard(idCard);
        System.out.println("身份证号码是否有效: " + isValid);
    }
}
相关推荐
道可到1 小时前
Java 反射现代实践速查表(JDK 11+/17+)
java
侃侃_天下1 小时前
最终的信号类
开发语言·c++·算法
道可到1 小时前
Java 反射现代实践指南(JDK 11+ / 17+ 适用)
java
玉衡子1 小时前
九、MySQL配置参数优化总结
java·mysql
叽哥1 小时前
Kotlin学习第 8 课:Kotlin 进阶特性:简化代码与提升效率
android·java·kotlin
麦兜*1 小时前
MongoDB Atlas 云数据库实战:从零搭建全球多节点集群
java·数据库·spring boot·mongodb·spring·spring cloud
带刺的坐椅1 小时前
DamiBus v1.1.0 发布(给单体多模块解耦)
java·事件总线·damibus
葡萄城技术团队1 小时前
用 Java 构建健壮 REST API 的 4 个关键技巧
java
杨杨杨大侠1 小时前
解密 atlas-mapper 框架 (9/10):故障排查与调试技巧
java·开源·github
Slaughter信仰1 小时前
深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)第十章知识点问答(10题)
java·jvm·数据库