Java正则表达式基础编写案例
基础正则表达式语法
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexBasicDemo {
public static void main(String[] args) {
// 1. 基础匹配
String text = "Hello123World456";
Pattern pattern = Pattern.compile("\\d+"); // 匹配数字
Matcher matcher = pattern.matcher(text);
// 查找匹配
while (matcher.find()) {
System.out.println("找到数字: " + matcher.group());
}
}
}
常用匹配模式示例
public class RegexPatterns {
public static void main(String[] args) {
// 2.1 匹配字符串是否包含字母
String str1 = "abc123";
boolean hasLetter = str1.matches(".*[a-zA-Z]+.*");
System.out.println("包含字母: " + hasLetter); // true
// 2.2 验证邮箱格式
String email = "test@example.com";
boolean isValidEmail = email.matches("^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$");
System.out.println("有效邮箱: " + isValidEmail); // true
// 2.3 验证手机号
String phone = "13800138000";
boolean isValidPhone = phone.matches("^1[3-9]\\d{9}$");
System.out.println("有效手机号: " + isValidPhone); // true
// 2.4 验证密码强度(至少8位,包含大小写字母和数字)
String password = "Password123";
boolean isStrongPassword = password.matches("^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d).{8,}$");
System.out.println("密码强度合格: " + isStrongPassword); // true
}
}
实用案例
public class RegexUseCases {
// 3.1 提取所有数字
public static void extractNumbers(String text) {
Pattern pattern = Pattern.compile("\\d+");
Matcher matcher = pattern.matcher(text);
System.out.println("提取数字:");
while (matcher.find()) {
System.out.println(matcher.group());
}
}
// 3.2 替换敏感信息
public static String maskPhoneNumber(String text) {
// 将手机号中间4位替换为****
return text.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");
}
// 3.3 分割字符串
public static void splitByRegex(String text) {
// 按非字母字符分割
String[] parts = text.split("[^a-zA-Z]+");
System.out.println("分割结果:");
for (String part : parts) {
if (!part.isEmpty()) {
System.out.println(part);
}
}
}
// 3.4 验证身份证号
public static boolean isValidIDCard(String idCard) {
// 简单验证:18位数字或17位数字+X
return idCard.matches("^[1-9]\\d{5}(19|20)\\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\\d|3[01])\\d{3}[0-9Xx]$");
}
public static void main(String[] args) {
// 测试提取数字
extractNumbers("订单号:12345, 金额:789元");
// 测试替换手机号
String text = "联系我:13800138000";
System.out.println("掩码后: " + maskPhoneNumber(text));
// 测试分割
splitByRegex("Hello123World!@#$Test");
// 测试身份证验证
String idCard = "110101199003071234";
System.out.println("身份证有效: " + isValidIDCard(idCard));
}
}
常见正则表达式速查表
public class RegexCheatsheet {
public static void main(String[] args) {
// 常用正则表达式
String[][] patterns = {
// 类别, 正则表达式, 说明
{"邮箱", "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$", "标准邮箱格式"},
{"手机号", "^1[3-9]\\d{9}$", "中国大陆手机号"},
{"身份证", "^\\d{17}[\\dXx]$", "18位身份证号"},
{"URL", "^(https?://)?[\\w.-]+\\.[a-zA-Z]{2,}(/\\S*)?$", "URL链接"},
{"IP地址", "^(?:(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)$", "IPv4地址"},
{"中文字符", "^[\\u4e00-\\u9fa5]+$", "纯中文"},
{"英文字母", "^[a-zA-Z]+$", "纯英文"},
{"数字", "^\\d+$", "纯数字"},
{"日期", "^\\d{4}-\\d{2}-\\d{2}$", "YYYY-MM-DD格式"},
{"时间", "^([01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d$", "HH:mm:ss格式"}
};
System.out.println("===== 常用正则表达式速查表 =====");
System.out.printf("%-10s %-40s %-20s%n", "类型", "正则表达式", "说明");
System.out.println("-".repeat(70));
for (String[] pattern : patterns) {
System.out.printf("%-10s %-40s %-20s%n", pattern[0], pattern[1], pattern[2]);
}
}
}
Pattern类和Matcher类常用方法
public class PatternMatcherMethods {
public static void main(String[] args) {
String text = "Java Java Java, Programming";
// Pattern类方法
Pattern pattern = Pattern.compile("Java", Pattern.CASE_INSENSITIVE); // 忽略大小写
// Matcher类方法
Matcher matcher = pattern.matcher(text);
// 5.1 find() - 查找匹配
System.out.println("=== find()示例 ===");
while (matcher.find()) {
System.out.println("找到: " + matcher.group() +
", 位置: " + matcher.start() + "-" + matcher.end());
}
// 5.2 matches() - 完全匹配
System.out.println("\n=== matches()示例 ===");
boolean isMatch = Pattern.matches("Java.*", "Java Programming");
System.out.println("完全匹配: " + isMatch); // true
// 5.3 lookingAt() - 从开头匹配
System.out.println("\n=== lookingAt()示例 ===");
matcher = Pattern.compile("Java").matcher("Java Programming");
System.out.println("开头匹配: " + matcher.lookingAt()); // true
// 5.4 replace系列方法
System.out.println("\n=== replace()示例 ===");
String result = text.replaceAll("Java", "Python");
System.out.println("替换结果: " + result);
// 5.5 分组功能
System.out.println("\n=== 分组示例 ===");
Pattern groupPattern = Pattern.compile("(\\d{3})-(\\d{4})-(\\d{4})");
Matcher groupMatcher = groupPattern.matcher("010-1234-5678");
if (groupMatcher.find()) {
System.out.println("区号: " + groupMatcher.group(1)); // 010
System.out.println("前缀: " + groupMatcher.group(2)); // 1234
System.out.println("号码: " + groupMatcher.group(3)); // 5678
}
}
}
实际应用示例:日志解析
public class LogParser {
public static void parseLogLine(String logLine) {
// 解析格式: [2024-01-15 10:30:00] [ERROR] 用户登录失败: 用户名=admin
String regex = "\\[(\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2})\\] \\[(\\w+)\\] (.+)";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(logLine);
if (matcher.matches()) {
String timestamp = matcher.group(1);
String level = matcher.group(2);
String message = matcher.group(3);
System.out.println("时间戳: " + timestamp);
System.out.println("日志级别: " + level);
System.out.println("消息内容: " + message);
}
}
public static void main(String[] args) {
String log = "[2024-01-15 10:30:00] [ERROR] 用户登录失败: 用户名=admin";
parseLogLine(log);
}
}
使用建议
- 性能优化:频繁使用的正则表达式应编译为Pattern对象
- 转义处理:在Java字符串中使用表示正则中的
- 复杂正则:使用非捕获组提高性能
- 测试验证:使用在线正则测试工具先验证表达式
- 边界匹配:注意使用和确保精确匹配
