Java正则表达式的使用

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] 只能是 abc gr[ae]y → “gray”/“grey”
[^abc] abc 外的任意字符 [^0-9] → 匹配非数字字符
[a-zA-Z] 所有小写和大写字母 [A-Za-z]+ → “Hello”
[a-d[m-p]] a-dm-p 的字母 匹配 admp
[a-z&&[def]] a-zdef 的交集(即 def 仅匹配 def
[a-z&&[^bc]] a-z 排除 bc 匹配 ade
[a-z&&[^m-p]] a-z 排除 m-p 匹配 a-lq-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}$";