1. 什么是正则表达式
正则表达式(Regular Expression,简称 Regex)是用于描述字符串模式的工具,通过特定语法规则实现字符串的匹配、查找、替换等操作。Java 通过 java.util.regex
包提供原生支持。
Java 中的核心类
Pattern
:编译后的正则表达式对象(不可变,线程安全)。
Matcher
:通过 Pattern
对字符串执行匹配操作。
2. 正则表达式作用
3. 正则表达式初体验
3.1 检验一个号码是否为 QQ 号
3.1.1 不使用正则校验 QQ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| public static boolean checkQQ(String qqStr) { if (qqStr == null || qqStr.startsWith("0") || qqStr.length() < 6 || qqStr.length() > 20) { return false; }
for (int i = 0; i < qqStr.length(); i++) { char c = qqStr.charAt(i); if (!Character.isDigit(c)) { return false; } }
return true; }
|
3.1.2 基于正则校验 QQ
1 2 3
| public static boolean checkQQRegex(String qqStr) { return Objects.nonNull(qqStr) && qqStr.matches("[0-9]\\d{5,19}"); }
|
3.1.3 对比说明
校验方式 |
代码复杂度 |
执行效率 |
可维护性 |
手动校验 |
高(需多层判断+循环) |
较高(遇到错误立即返回) |
低(规则分散) |
正则表达式校验 |
低(单行实现) |
略低(需完整匹配) |
高(规则集中) |
两种实现方式都能准确校验 QQ 号格式,正则表达式版本更简洁且易于扩展,适合处理复杂规则;手动校验版本更适合需要逐层错误提示的场景。
4. 语法书写规则
4.1 字符类(匹配单个字符)
语法 |
匹配范围 |
示例说明 |
[abc] |
只能是 a 、b 或 c |
gr[ae]y → “gray”/“grey” |
[^abc] |
除 a 、b 、c 外的任意字符 |
[^0-9] → 匹配非数字字符 |
[a-zA-Z] |
所有小写和大写字母 |
[A-Za-z]+ → “Hello” |
[a-d[m-p]] |
a-d 或 m-p 的字母 |
匹配 a 、d 、m 、p |
[a-z&&[def]] |
a-z 与 def 的交集(即 d 、e 、f ) |
仅匹配 d 、e 、f |
[a-z&&[^bc]] |
a-z 排除 b 和 c |
匹配 a 、d 、e 等 |
[a-z&&[^m-p]] |
a-z 排除 m-p |
匹配 a-l 和 q-z |
4.2 预定义字符(匹配单个字符)
语法 |
匹配内容 |
示例应用 |
. |
任意字符(除换行符) |
a.c → “abc”/“a1c” |
\d |
数字字符 |
\d{3} → “123” |
\D |
非数字字符 |
\D+ → “user_“ |
\s |
空白字符(空格、制表符等) |
\s+ → 匹配连续空白 |
\S |
非空白字符 |
\S+ → “Hello” |
\w |
单词字符(字母、数字、下划线) |
\w+ → “user_123” |
\W |
非单词字符 |
\W → “@” |
4.3 数量词(控制出现次数)
语法 |
匹配规则 |
示例说明 |
x? |
x 出现 0 或 1 次 |
colou?r → “color”/“colour” |
x* |
x 出现 0 次或多次 |
a* → “”, “a”, “aaa” |
x+ |
x 出现 1 次或多次 |
\d+ → “7”, “2023” |
x{n} |
x 出现 正好 n 次 |
\d{4} → “2024” |
x{n,} |
x 出现 至少 n 次 |
a{3,} → “aaa”/“aaaaa” |
x{n,m} |
x 出现 n 到 m 次 |
\d{2,4} → “12”/“1234” |
附录:常用正则表达式示例
1. 校验手机号
1
| String regex = "1[3-9]\\d{9}";
|
2. 校验邮箱
1
| String regex = "^[\\w.-]+@[\\w.-]+\\.[a-zA-Z]{2,}$";
|
3. 校验身份证号(18 位)
1
| String regex = "\\d{6}(18|19|20)\\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\\d|3[01])\\d{3}[0-9Xx]";
|
4. 校验 IP 地址
1
| String regex = "((25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)";
|
5. 校验 URL
1
| String regex = "^(https?://)?([\\w-]+\\.)+[\\w-]+(/\\S*)?$";
|
6. 校验日期(YYYY-MM-DD)
1
| String regex = "\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])";
|
7. 校验密码强度(8-16 位,含大小写字母和数字)
1
| String regex = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)[A-Za-z\\d]{8,16}$";
|