Java正则表达式教程:从基础到实战的全面指南
一、正则表达式基础概念
正则表达式(Regular Expression)是用于文本模式匹配的特殊字符序列,通过组合普通字符和元字符实现复杂字符串操作。在Java中,正则表达式主要通过
java.util.regex
包中的
Pattern
和
Matcher
类实现5。
核心组件说明:
Pattern:编译后的正则表达式模板,相当于预处理后的匹配规则
Matcher:执行具体匹配操作的引擎,负责与目标字符串交互
二、基础语法详解
1. 基本元字符
.
匹配任意单个字符(换行符除外)
c.t
匹配 "cat"、"cut"
\d
匹配数字字符
\d{4}
匹配 "1999"
\w
匹配字母、数字、下划线
\w+
匹配 "Hello123"
^
匹配字符串开头
^Java
匹配 "Java..."
$
匹配字符串结尾
\.java$
匹配 ".java"
2. 量词修饰符
*
:匹配前项0次或多次(如
a*
匹配空字符串、"a"、"aa"等)
+
:匹配前项1次或多次
?
:匹配前项0次或1次
{n,m}
:匹配前项至少n次最多m次(如
\d{4,6}
匹配4-6位数字)
三、核心操作实战
1. 字符串匹配
Pattern pattern = Pattern.compile("\\d{4}-\\d{2}-\\d{2}"); // 日期格式验证 Matcher matcher = pattern.matcher("2023-06-05");
boolean isMatch = matcher.matches; // 返回true
2. 分组捕获
Pattern pattern = Pattern.compile("(\\d{4})-(\\d{2})-(\\d{2})");
Matcher matcher = pattern.matcher("2023-06-05");
if (matcher.find) {
System.out.println(" 年份:" + matcher.group); // 输出2023 System.out.println(" 月份:" + matcher.group); // 输出06 }
```
### 3. 常见验证场景
| 验证类型 | 正则表达式模式 | 示例 |
|----------------|-----------------------------------------|--------------------------|
| 邮箱地址 | `\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+` | "user@example.com" |
| 手机号码 | `^1[3-9]\\d{9}$` | "13812345678" |
| 身份证号码 | `(\\d{18}|\\d{15})` | "31010519900307002X" |
## 四、性能优化技巧
1. **预编译正则表达式**
```java
// 错误写法(重复编译) String result = text.replaceAll("\\s+", " ");
// 优化写法(预编译) Pattern whitespacePattern = Pattern.compile("\\s+");
Matcher matcher = whitespacePattern.matcher(text);
String result = matcher.replaceAll(" ");
```
2. **使用边界匹配**
``` ```java
// 优化前 Pattern.compile("\\d+"); // 匹配任意位置数字 // 优化后 Pattern.compile("^\\d+$"); // 仅匹配纯数字字符串 ```
3. **避免回溯陷阱**
```java
// 高风险模式(可能导致指数级回溯) Pattern.compile("(a+)+");
// 优化方案 Pattern.compile("a+");
```
## 五、高级应用场景
### 1. 动态替换
``````java
String sql = "SELECT * FROM users WHERE id=123 AND name='张三'";
Pattern pattern = Pattern.compile("(\\d+) |('[^']*')");
Matcher matcher = pattern.matcher(sql);
while (matcher.find) {
if (matcher.group != null) {
System.out.println(" 数字参数:" + matcher.group);
} else {
System.out.println(" 字符串参数:" + matcher.group);
}
}
```
### 2. 日志解析
```java
String logLine = "2023-06-05 14:30:45 ERROR [main] com.example.Main - Connection refused";
Pattern logPattern = Pattern.compile(
"(\\d{4}-\\d{2}-\\d{2})\\s" + // 日期 "(\\d{2}:\\d{2}:\\d{2})\\s" + // 时间 "(\\w+)\\s" + // 日志级别 "\\[(.*?)\\]\\s" + // 线程名 "(.*)$" // 日志内容 );
```
## 六、常见问题解决方案
1. **特殊字符转义**
在正则表达式中,`^$.*+?[]{}|`等字符需要使用反斜杠转义,但在Java字符串中需写成双反斜杠(如`\\.`匹配点号)
2. **多行匹配**
使用`Pattern.MULTILINE`标志处理多行文本:
``` ```java
Pattern.compile("^\\d+$", Pattern.MULTILINE);
```
3. **性能监控**
通过`java.util.regex.Pattern` 的`EXACTLY`标志验证正则表达式结构:
```java
Pattern.compile("\\d+", Pattern.EXACTLY);
```
> 本文内容综合自Java官方文档及等权威技术资源,建议结合[Java正则表达式在线测试工具](https://regex101.com/) 进行实践验证。