Java 的 正则表达式

Java 的 正则表达式(Regular Expression,简称 regex) 主要使用 java.util.regex 包中的 Pattern 和 Matcher 类来进行文本匹配和处理。


1. Java 正则表达式的核心类

类 作用
Pattern 表示编译后的正则表达式。
Matcher 用于执行匹配操作(如查找、替换)。
PatternSyntaxException 用于表示正则表达式语法错误的异常。

2. 正则表达式基本语法

(1)常见的元字符

元字符 作用
. 匹配任意字符(除换行符)
\d 匹配数字 [0-9]
\D 匹配非数字 [^0-9]
\w 匹配单词字符 [a-zA-Z_0-9]
\W 匹配非单词字符 [^a-zA-Z_0-9]
\s 匹配空白字符(空格、制表符、换行符等)
\S 匹配非空白字符
^ 匹配字符串的开始
$ 匹配字符串的结束
\b 匹配单词边界

(2)常见的限定符

限定符 作用
* 匹配前面的字符 0 次或多次 (ab* 可匹配 a、ab、abb...)
+ 匹配前面的字符 1 次或多次 (ab+ 只能匹配 ab、abb...)
? 匹配前面的字符 0 次或 1 次 (ab? 可匹配 a 或 ab)
{n} 匹配前面的字符 恰好 n 次
{n,} 匹配前面的字符 至少 n 次
{n,m} 匹配前面的字符 至少 n 次,至多 m 次

(3)字符类(Character Classes)

字符类 作用
[abc] 匹配 a 或 b 或 c
[^abc] 匹配除 a、b、c 以外的任意字符
[a-z] 匹配 a 到 z 之间的任意小写字母
[A-Z] 匹配 A 到 Z 之间的任意大写字母
[0-9] 匹配 0 到 9 之间的任意数字

3. Java 代码示例

(1)匹配手机号

复制代码
import java.util.regex.*;

public class RegexExample {
    public static void main(String[] args) {
        String regex = "1[3-9]\\d{9}";  // 匹配中国大陆手机号
        String text = "我的手机号是 13812345678。";
        
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(text);
        
        if (matcher.find()) {
            System.out.println("匹配到的手机号: " + matcher.group());
        } else {
            System.out.println("未匹配到手机号");
        }
    }
}

输出:

复制代码
匹配到的手机号: 13812345678

(2)验证邮箱格式

复制代码
public class EmailValidation {
    public static void main(String[] args) {
        String regex = "^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+\\.[a-zA-Z]+$";
        String email1 = "user@example.com";
        String email2 = "invalid-email.com";

        System.out.println(email1.matches(regex)); // true
        System.out.println(email2.matches(regex)); // false
    }
}

(3)提取字符串中的数字

复制代码
import java.util.regex.*;

public class ExtractNumbers {
    public static void main(String[] args) {
        String text = "订单号: 12345, 价格: 89.99元";
        Pattern pattern = Pattern.compile("\\d+");
        Matcher matcher = pattern.matcher(text);
        
        while (matcher.find()) {
            System.out.println("找到的数字: " + matcher.group());
        }
    }
}

输出:

复制代码
找到的数字: 12345
找到的数字: 89
找到的数字: 99

(4)替换字符串中的内容

复制代码
public class ReplaceText {
    public static void main(String[] args) {
        String text = "Hello, Java! Java is powerful.";
        String replacedText = text.replaceAll("Java", "Python");
        System.out.println(replacedText);
    }
}

输出:

复制代码
Hello, Python! Python is powerful.

4. 常见应用场景

场景 正则表达式
手机号匹配 "1[3-9]\\d{9}"
邮箱匹配 "^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+\\.[a-zA-Z]+$"
IP 地址匹配 "\\b(?:\\d{1,3}\\.){3}\\d{1,3}\\b"
提取 HTML 标签内容 "<[^>]+>"
验证 URL `"^(http
过滤非数字字符 "\\D"

5. Pattern 进阶用法

使用 Pattern.compile 进行多次匹配,提高性能

复制代码
Pattern pattern = Pattern.compile("\\d+");
Matcher matcher = pattern.matcher("价格是 299 元,折扣价 199 元");

while (matcher.find()) {
    System.out.println(matcher.group());
}

使用 Pattern 标志位(Flags)

复制代码
Pattern pattern = Pattern.compile("hello", Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher("Hello World");
System.out.println(matcher.find());  // true
相关推荐
论文复现现场3 分钟前
DeepSeek V4.1 Flash 各平台价格怎么比?缓存、峰谷计费与 Python 成本计算
开发语言·python·缓存·大模型·成本优化·deepseek
xuxigifxfh4 分钟前
牛客:HJ21 简单密码
java·开发语言·算法
小π军5 分钟前
C 和 C++ 是否都支持函数的重载?
java·c语言·c++
sp42a10 分钟前
简单的 Spring 文件上传与下载组件
java·后端·spring
步行cgn13 分钟前
为什么 Spring 建议使用构造器注入?
java·后端·spring
Nefu_lyh14 分钟前
【工作杂谈_20261012】数据平台与工程治理: Spark OOM 排查:Java Heap、Executor 与代码内存模型
java·大数据·spark
小蒜学长15 分钟前
基于Vue.js + Spring Boot的酒店客房预订系统设计与实现(代码+数据库+LW)
java·数据库·spring boot·后端·酒店客房预订系统
ESDWAN19 分钟前
海外股票网络环境优化与交易场景应用:从行情获取到交易系统稳定性设计
开发语言·网络·php
真恋寄语枫秋21 分钟前
【Java零基础入门28】Java包机制详解:package包定义、import导入、权限访问、项目分层管理
java
豆角焖肉21 分钟前
SpringBoot + Redis 缓存实战
java·spring boot·redis·后端·缓存·菜单缓存