Java 正则表达式使用详解
正则表达式在 Java 中主要用于字符串的匹配、查找、替换和分割操作。Java 提供了 java.util.regex
包,其中的核心类包括 Pattern
和 Matcher
。
核心类
Pattern
类- 表示正则表达式的编译表示。
- 使用
Pattern.compile(String regex)
方法编译正则表达式。 - 是不可变的,线程安全。
Matcher
类- 用于执行匹配操作。
- 使用
Pattern.matcher(String input)
方法创建。
PatternSyntaxException
- 当正则表达式语法不正确时抛出。
常见用法
1. 验证字符串格式
import java.util.regex.Pattern;
public class RegexExample {
public static void main(String[] args) {
String emailRegex = "^[A-Za-z0-9+_.-]+@[A-Za-z0-9.-]+$";
String email = "example@domain.com";
boolean isValid = Pattern.matches(emailRegex, email);
System.out.println("Is valid email: " + isValid); // 输出: true
}
}
-
方法说明
:
Pattern.matches(regex, input)
:直接验证输入是否匹配正则表达式。
2. 查找和匹配
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexExample {
public static void main(String[] args) {
String text = "Java is a programming language. Java is also a platform.";
String regex = "Java";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(text);
while (matcher.find()) {
System.out.println("Found at index: " + matcher.start());
}
}
}
-
常用方法
:
matcher.find()
:查找下一个匹配项。matcher.start()
:获取匹配的起始索引。matcher.end()
:获取匹配的结束索引。matcher.group()
:获取匹配的内容。
3. 字符串替换
import java.util.regex.Pattern;
public class RegexExample {
public static void main(String[] args) {
String text = "The color is red.";
String regex = "red";
String replacement = "blue";
String result = text.replaceAll(regex, replacement);
System.out.println(result); // 输出: The color is blue.
}
}
-
方法说明
:
replaceAll(String regex, String replacement)
:将所有匹配项替换为指定内容。replaceFirst(String regex, String replacement)
:仅替换第一个匹配项。
4. 字符串分割
import java.util.regex.Pattern;
public class RegexExample {
public static void main(String[] args) {
String text = "one,two,three";
String regex = ",";
String[] parts = text.split(regex);
for (String part : parts) {
System.out.println(part);
}
}
}
-
方法说明
:
split(String regex)
:根据正则表达式分割字符串。
常用正则表达式示例
用途 | 正则表达式 | 说明 |
---|---|---|
邮箱验证 | ^[A-Za-z0-9+_.-]+@[A-Za-z0-9.-]+$ | 验证邮箱格式 |
手机号验证(中国) | ^1[3-9]\\d{9}$ | 验证 11 位手机号 |
数字验证 | ^\\d+$ | 纯数字 |
IP 地址验证 | ^(\\d{1,3}\\.){3}\\d{1,3}$ | 验证 IPv4 地址 |
日期验证 | ^\\d{4}-\\d{2}-\\d{2}$ | 验证格式如 2024-01-01 |
URL 验证 | `^(http | https)😕/[A-Za-z0-9.-]+.[A-Za-z]+.*$` |
含字母和数字的密码 | ^(?=.*[A-Za-z])(?=.*\\d)[A-Za-z\\d]{6,20}$ | 至少 6-20 位,包含字母和数字 |
完整示例:解析日志文件
以下代码示例演示如何使用正则表达式从日志文件中提取 IP 地址。
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class LogParser {
public static void main(String[] args) {
String logs = "192.168.1.1 - - [10/Jan/2025:10:00:00] \"GET /index.html\" 200\n" +
"172.16.0.2 - - [10/Jan/2025:10:01:00] \"POST /login\" 403";
String ipRegex = "\\b(?:\\d{1,3}\\.){3}\\d{1,3}\\b";
Pattern pattern = Pattern.compile(ipRegex);
Matcher matcher = pattern.matcher(logs);
while (matcher.find()) {
System.out.println("Found IP: " + matcher.group());
}
}
}
注意事项
- 正则表达式的转义
- 在 Java 中,
\
是转义字符,需用\\
表示。例如,正则中的\d
在 Java 中需写作\\d
。
- 在 Java 中,
- 性能优化
- 避免重复编译相同的正则表达式,可以将
Pattern
存为静态变量或单例。
- 避免重复编译相同的正则表达式,可以将
- Debug 正则表达式
- 使用工具(如 Regex101)调试正则表达式。
通过灵活运用 Java 的正则表达式功能,可以高效地处理字符串解析、验证和转换任务!