Java 正则表达式基础
正则表达式(Regular Expression,简称 regex)是一种强大的文本匹配工具,它通过特定的语法规则描述字符串模式,在 Java 中,正则表达式主要通过 java.util.regex 包中的 Pattern 和 Matcher 类实现,本文将详细介绍如何在 Java 中使用正则表达式,包括基础语法、核心类、常用方法及实际应用场景。

正则表达式基础语法
正则表达式的核心在于其元字符(Metacharacters),这些字符具有特殊含义,用于定义匹配模式,以下是常用的元字符及其功能:
-
字符匹配
- 匹配除换行符外的任意单个字符。
[]:匹配方括号内的任意一个字符。[abc]匹配 “a”、”b” 或 “c”。[^]:匹配不在方括号内的任意字符。[^abc]匹配除 “a”、”b”、”c” 外的任意字符。\d:匹配任意数字,等同于[0-9]。\D:匹配非数字字符,等同于[^0-9]。\w:匹配单词字符(字母、数字、下划线),等同于[a-zA-Z0-9_]。\W:匹配非单词字符。\s:匹配空白字符(空格、制表符、换行符等)。\S:匹配非空白字符。
-
量词
- 匹配前一个字符零次或多次。
- 匹配前一个字符一次或多次。
- 匹配前一个字符零次或一次。
{n}:匹配前一个字符恰好 n 次。{n,}:匹配前一个字符至少 n 次。{n,m}:匹配前一个字符至少 n 次,至多 m 次。
-
边界匹配
^:匹配字符串的开始。- 匹配字符串的结束。
\b:匹配单词边界。\B:匹配非单词边界。
-
逻辑分组
- 分组,可以捕获子表达式。
- 或操作符,匹配左右表达式中的任意一个。
Java 正则表达式的核心类
Java 中使用正则表达式主要涉及 Pattern 和 Matcher 两个类,以及 String 类中提供的相关方法。
-
Pattern 类
Pattern类是正则表达式的编译表示,用于定义匹配模式,其常用方法包括:compile(String regex):将正则表达式字符串编译为Pattern对象。matcher(CharSequence input):创建匹配给定输入的Matcher对象。matches(String regex, CharSequence input):快速判断输入是否完全匹配正则表达式。
示例:

Pattern pattern = Pattern.compile("\\d+"); Matcher matcher = pattern.matcher("12345"); boolean isMatch = matcher.matches(); // 返回 true -
Matcher 类
Matcher类是对输入字符串进行解释和匹配操作的引擎,常用方法包括:matches():判断整个输入字符串是否匹配正则表达式。lookingAt():判断输入字符串的开头是否匹配正则表达式。find():查找输入字符串中是否匹配正则表达式的子串。group():返回最近匹配的子串。start()和end():返回匹配子串的起始和结束索引。
示例:
String text = "Hello, my phone is 123-456-7890."; Pattern pattern = Pattern.compile("\\d{3}-\\d{3}-\\d{4}"); Matcher matcher = pattern.matcher(text); if (matcher.find()) { System.out.println("Found phone number: " + matcher.group()); }
String 类中的正则方法
String 类也提供了一些支持正则表达式的方法,简化了常见操作:
-
matches(String regex)
判断字符串是否完全匹配正则表达式。boolean isDigit = "123".matches("\\d+"); // 返回 true -
replaceAll(String regex, String replacement)
替换所有匹配正则表达式的子串。String result = "abc123def".replaceAll("\\d", "X"); // 返回 "abcXXXdef" -
replaceFirst(String regex, String replacement)
替换第一个匹配正则表达式的子串。String result = "abc123def".replaceFirst("\\d", "X"); // 返回 "abcX23def" -
split(String regex)
根据正则表达式分割字符串。String[] parts = "a,b,c".split(","); // 返回 ["a", "b", "c"]
正则表达式的实际应用场景
-
验证输入格式
验证邮箱地址、手机号码或日期格式:
String email = "user@example.com"; boolean isValidEmail = email.matches("^[\\w.-]+@[\\w.-]+\\.[a-zA-Z]{2,}$"); -
提取子字符串
从文本中提取特定信息,如日志中的时间戳或 HTML 标签:String log = "[2023-10-01] ERROR: Connection failed"; Pattern pattern = Pattern.compile("\\[(.*?)\\]"); Matcher matcher = pattern.matcher(log); if (matcher.find()) { System.out.println("Date: " + matcher.group(1)); } -
替换敏感信息
在处理用户输入时,隐藏敏感信息如身份证号或密码:String sensitiveData = "Password: 123456"; String maskedData = sensitiveData.replaceAll("\\d", "*"); // 返回 "Password: ******" -
复杂文本解析
解析结构化文本,如 CSV 文件或配置文件:String csv = "John,Doe,30"; String[] fields = csv.split(","); // 返回 ["John", "Doe", "30"]
性能优化与注意事项
-
预编译正则表达式
如果正则表达式会被多次使用,建议预编译Pattern对象以提高性能:private static final Pattern PHONE_PATTERN = Pattern.compile("\\d{3}-\\d{3}-\\d{4}"); -
避免贪婪匹配
贪婪匹配(如 )可能导致性能问题,建议使用惰性匹配(如 ):String text = "<div>Content</div>"; Pattern pattern = Pattern.compile("<div>(.*?)</div>"); // 惰性匹配 -
处理特殊字符
如果正则表达式中包含特殊字符(如 、),需使用\\转义:String regex = "\\$\\d+\\.\\d{2}"; // 匹配 "$123.45"
正则表达式是 Java 中处理文本的强大工具,掌握其基础语法和核心类可以显著提高开发效率,通过 Pattern 和 Matcher 类,结合 String 类提供的方法,可以实现复杂的文本匹配、验证、提取和替换操作,在实际应用中,注意性能优化和特殊字符处理,可以更好地发挥正则表达式的优势,无论是简单的格式验证还是复杂的文本解析,正则表达式都能提供简洁高效的解决方案。


















