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);
    }
}
相关推荐
SomeB1oody5 分钟前
【Rust自学】4.1. 所有权:栈内存 vs. 堆内存
开发语言·后端·rust
toto4126 分钟前
线程安全与线程不安全
java·开发语言·安全
筏镜33 分钟前
调整docker bridge地址冲突,通过bip调整 bridge地址
java·docker·eureka
水木流年追梦38 分钟前
【python因果库实战10】为何需要因果分析
开发语言·python
winner888141 分钟前
git merge 冲突 解决 show case
java·git·git merge·git冲突
w(゚Д゚)w吓洗宝宝了2 小时前
C vs C++: 一场编程语言的演变与对比
c语言·开发语言·c++
AI人H哥会Java2 小时前
【Spring】Spring的模块架构与生态圈—Spring MVC与Spring WebFlux
java·开发语言·后端·spring·架构
开心工作室_kaic2 小时前
springboot461学生成绩分析和弱项辅助系统设计(论文+源码)_kaic
开发语言·数据库·vue.js·php·apache
毕设资源大全3 小时前
基于SpringBoot+html+vue实现的林业产品推荐系统【源码+文档+数据库文件+包部署成功+答疑解惑问到会为止】
java·数据库·vue.js·spring boot·后端·mysql·html
Watermelon_Mr3 小时前
Spring(三)-SpringWeb-概述、特点、搭建、运行流程、组件、接受请求、获取请求数据、特殊处理、拦截器
java·后端·spring