Java 正则表达式是处理字符串匹配、查找、替换的强大工具,以下是常用的正则表达式语法、示例及使用场景总结:
一、基础语法
| 元字符 | 描述 | ||
|---|---|---|---|
. |
匹配任意单个字符(除换行符 \n) |
||
* |
匹配前一个字符 0 次或多次 | ||
+ |
匹配前一个字符 1 次或多次 | ||
? |
匹配前一个字符 0 次或 1 次 | ||
^ |
匹配字符串开头 | ||
$ |
匹配字符串结尾 | ||
[] |
字符集,匹配其中任意一个字符(如 [abc] 匹配 a、b 或 c) |
||
[^] |
否定字符集,匹配不在其中的字符(如 [^abc] 匹配非 a、b、c 的字符) |
||
| ` | ` | 分支条件,匹配左边或右边的表达式(如 `a | b` 匹配 a 或 b) |
() |
捕获组,将表达式分组,可通过 group(n) 获取匹配结果 |
||
\ |
转义字符,匹配特殊字符(如 \. 匹配 .) |
二、预定义字符类
| 表达式 | 描述 |
|---|---|
\d |
匹配数字(等价于 [0-9]) |
\D |
匹配非数字(等价于 [^0-9]) |
\w |
匹配字母、数字、下划线(等价于 [a-zA-Z0-9_]) |
\W |
匹配非字母、数字、下划线(等价于 [^a-zA-Z0-9_]) |
\s |
匹配空白字符(空格、制表符 \t、换行符 \n 等) |
\S |
匹配非空白字符 |
\b |
单词边界(如 \bword\b 匹配独立的 "word") |
\B |
非单词边界 |
三、量词
| 表达式 | 描述 |
|---|---|
{n} |
匹配前一个字符恰好 n 次(如 a{3} 匹配 "aaa") |
{n,} |
匹配前一个字符至少 n 次(如 a{2,} 匹配 "aa"、"aaa" 等) |
{n,m} |
匹配前一个字符 n 到 m 次(如 a{1,3} 匹配 "a"、"aa"、"aaa") |
*? |
非贪婪匹配(尽可能少匹配,如 a.*?b 匹配 "aab" 中的 "aab" 而非更长的) |
+?、??、{n,m}? |
同理,非贪婪模式的其他量词 |
四、常用场景示例
1. 校验数字
- 整数:
^-?\d+$(支持正负整数) - 正整数:
^[1-9]\d*$ - 浮点数:
^-?\d+(\.\d+)?$(支持正负小数) - 保留 2 位小数:
^-?\d+(\.\d{2})?$
2. 校验字符串
- 仅字母:
^[a-zA-Z]+$ - 字母 + 数字:
^[a-zA-Z0-9]+$ - 中文:
^[\u4e00-\u9fa5]+$(匹配纯中文) - 字母 + 数字 + 下划线:
^\w+$
3. 校验日期 / 时间
- 日期(yyyy-mm-dd):
^\d{4}-\d{2}-\d{2}$(简单校验,未验证合法性) - 时间(hh:mm:ss):
^\d{2}:\d{2}:\d{2}$
4. 校验手机号 / 邮箱
- 手机号(中国大陆):
^1[3-9]\d{9}$ - 邮箱:
^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$
5. 校验 URL
- 简单 URL:
^https?://[^\s]+$(匹配 http/https 开头的 URL)
6. 提取 / 替换
- 提取 HTML 标签内容:
<(\w+)>(.*?)</\1>(通过组提取标签名和内容) - 替换空格:
str.replaceAll("\\s+", "")(去除所有空白字符)
五、Java 中使用正则的核心类
1.Pattern:编译正则表达式为模式对象(线程安全)。
java
Pattern pattern = Pattern.compile("\\d+"); // 编译正则
2.Matcher:匹配器,用于对字符串执行匹配操作。
java
Matcher matcher = pattern.matcher("abc123def");
boolean found = matcher.find(); // 是否找到匹配
String group = matcher.group(); // 获取匹配的内容(需先调用 find()/matches())
3. 常用方法:
matches():全字符串匹配(等价于正则前后加^$)。find():查找字符串中是否有匹配的子串。replaceAll(String replacement):替换所有匹配的子串。
六、注意事项
- Java 字符串中
\需转义为\\(如正则\d在 Java 中写为\\d)。 - 贪婪模式 vs 非贪婪模式:默认是贪婪模式(尽可能多匹配),加
?切换为非贪婪。 - 性能:复杂正则可能影响性能,避免过度使用嵌套或通配符(如
.*)。
以上涵盖了 Java 正则的核心语法和常见场景,实际使用时可根据需求组合调整。