正则表达式(Regular Expression)是处理字符串的强大工具,它通过预定义的模式匹配字符串,实现校验、查找、替换、切割等操作。在 Java 中,String 类的 matches()、replaceAll()、split() 等方法均支持正则表达式,配合 java.util.regex 包可实现复杂字符串处理。本文将从基础语法到实战案例,全面解析 Java 正则表达式的用法。
一、正则表达式基础:核心概念与作用
1. 什么是正则表达式?
正则表达式是由一系列字符和特殊符号组成的 “模式字符串”,用于描述字符串的格式规则。例如,用 [1-9]\\d{5,19} 可匹配 6-20 位的 QQ 号(首位非 0,其余为数字)。
2. 核心作用
- 校验字符串格式:如验证手机号、邮箱、身份证号等是否符合规则。
- 查找 / 替换字符串:在文本中定位符合规则的子串,或按规则替换内容。
- 切割字符串:按正则模式拆分字符串(比固定字符切割更灵活)。
3. Java 中的正则入口
String 类的 matches(String regex) 方法是最基础的应用,用于判断字符串是否完全匹配正则模式(注意:是完全匹配,而非部分包含)。
二、正则表达式核心语法:字符、量词与分组
1. 字符类:匹配单个字符
通过 [] 定义一组可匹配的字符,仅匹配一个字符。
| 语法 | 含义 | 示例 |
|---|---|---|
[abc] | 匹配 a、b、c 中的任意一个字符 | [abc] 匹配 "a"、"b" |
[^abc] | 匹配除 a、b、c 外的任意字符(^ 表示取反) | [^abc] 匹配 "d"、"1" |
[a-zA-Z] | 匹配任意大小写字母 | [a-zA-Z] 匹配 "A"、"b" |
[a-d[m-p]] | 匹配 a-d 或 m-p 中的字符(并集) | 等价于 [a-dm-p] |
[a-z&&[^bc]] | 匹配 a-z 中除 b、c 外的字符(交集) | 等价于 [ad-z] |
2. 预定义字符:简化常用字符类
为简化常见字符匹配,正则提供预定义字符(均匹配一个字符):
| 预定义字符 | 含义 | 等价字符类 |
|---|---|---|
. | 匹配任意字符(除换行符 \n) | - |
\d | 匹配数字(0-9) | [0-9] |
\D | 匹配非数字 | [^0-9] |
\s | 匹配空白字符(空格、制表符 \t、换行 \n 等) | [\t\n\x0b\f\r ] |
\S | 匹配非空白字符 | [^\s] |
\w | 匹配字母、数字、下划线 | [a-zA-Z0-9_] |
\W | 匹配非字母、数字、下划线 | [^\w] |
注意:在 Java 字符串中,\ 需转义为 \\,因此正则中的 \d 在代码中需写为 \\d。
3. 数量词:匹配多个字符
用于指定前面的字符 / 子模式重复的次数(默认贪婪匹配,即尽可能多匹配)。
| 数量词 | 含义 | 示例 |
|---|---|---|
X? | X 出现 0 次或 1 次 | a? 匹配 ""、"a" |
X* | X 出现 0 次或多次 | a* 匹配 ""、"a"、"aa" |
X+ | X 出现 1 次或多次 | a+ 匹配 "a"、"aa" |
X{n} | X 恰好出现 n 次 | a{2} 匹配 "aa" |
X{n,} | X 至少出现 n 次 | a{2,} 匹配 "aa"、"aaa" |
X{n,m} | X 出现 n 到 m 次(含 n 和 m) | a{2,3} 匹配 "aa"、"aaa" |
4. 分组:复用子模式
用 () 将部分正则括起来作为 “分组”,可实现子模式复用或批量操作。
-
捕获分组:分组后可通过
\\组号(正则内部)或$组号(正则外部,如替换时)复用分组内容。- 组号从 1 开始,按左括号顺序编号。
- 示例:判断字符串首尾字符是否相同(如 "a123a"):
String regex = "(.).+\\1"; // (.) 为第1组,\\1 复用第1组内容 System.out.println("a123a".matches(regex)); // true
-
非捕获分组:仅用于分组,无需复用,格式为
(?:正则)、(?=正则)等(较少用)。
三、正则表达式在字符串中的应用
1. 校验:String.matches(String regex)
判断字符串是否完全匹配正则模式(常用作格式校验)。
示例:验证 QQ 号(6-20 位,首位非 0,全数字):
public static void checkQQ(String qqNum) {
// [1-9]:首位非0;\\d{5,19}:后面5-19位数字(总长度6-20)
boolean isValid = qqNum.matches("[1-9]\\d{5,19}");
System.out.println(isValid ? "QQ号格式正确" : "QQ号格式错误");
}
替换:String.replaceAll(String regex, String newStr)
按正则模式匹配子串,并用 newStr 替换(替换所有匹配项)。
示例:去重连续重复字符(如 "我想玩玩三角角角洲洲洲" → "我想玩三角洲"):
public static void outUseGrouping(){
//需求:
//将字符串:我想玩三角角角角角角角洲洲州州洲洲洲
//替换为:我想玩三角洲
//(.)表示把重复的内容的第一个字符看做一组
// \\1表示第一个字符再次出现
// + 至少一次
// $1 表示把正则表达式中的第一组的内容,再拿出来用
String str="我想玩玩三角角角角角角角洲洲洲洲洲洲";
String result=str.replaceAll("(.)\\1+","$1");
System.out.println(result);
}
切割:String.split(String regex)
按正则模式拆分字符串,返回字符串数组。
示例:按任意空白字符切割文本:
public static void StringUseRegex() {
//有一段字符串:Mr.Rabbit always angry with Ms.watermelon
//要求1:把字符串中的Mr.Rabbit 和Ms.Watermelon中间的字母换成love
//要求2:把字符串中的Mr.Rabbit和Ms.Watermelon切割出来
//1.
//细节:
//方法在底层会跟之前一样也会创建文本解析器的对象
//然后从头开始去读取字符串中的内容,只要有满足的,那么久用第二个参数去替换
String text="兔子先生alwaysangrywith西瓜小姐";
String result=text.replaceAll("[\\w&&[^_]]+","LOVE");
System.out.println(result);
//2.
String[] result2=text.split("[\\w&&[^_]]+");
for (int i = 0; i < result2.length; i++) {
System.out.println(result2[i]);
}
}
四、实战案例:常见格式验证
1. 验证手机号
规则:11 位数字,首位为 1,第二位为 3-9,后 9 位为任意数字。
String regex = "1[3-9]\\d{9}";
String[] phones = {"13112345678", "13712345667", "139456790271"};
for (String phone : phones) {
System.out.println(phone + ":" + phone.matches(regex));
// 输出:true、true、false(最后一个12位)
}
2. 验证邮箱
规则:用户名(字母、数字、下划线)+ @ + 域名(2-6 位字母 / 数字)+ . + 后缀(2-3 位字母,可多个后缀如 .com.cn)。
String regex = "\\w+@[\\w&&[^_]]{2,6}(\\.[a-zA-Z]{2,3}){1,2}";
String[] emails = {"32332323@qq.com", "zhangsan@itcast.cn", "dlei0009@pci.com.cn"};
for (String email : emails) {
System.out.println(email + ":" + email.matches(regex)); // 均为true
}
3. 验证身份证号(简单版)
规则:18 位,前 17 位为数字,最后一位为数字或 X(大小写均可)。
String regex = "\\d{17}[0-9xX]";
String idCard = "420106199001011234";
System.out.println(idCard.matches(regex)); // true
4. 验证用户名
规则:由字母、数字、下划线组成,长度 4-16 位。
String regex = "\\w{4,16}";
String username = "java_coder";
System.out.println(username.matches(regex)); // true(长度8,符合规则)
五、正则表达式编写技巧
- 从正确案例出发:先分析合法字符串的格式(如手机号 “13112345678”→ 首位 1,第二位 3-9,后 9 位数字),逐步拆解规则。
- 分步验证:复杂正则可拆分为多个子规则,逐步拼接(如邮箱 = 用户名 + @ + 域名 + 后缀)。
- 利用工具辅助:可使用 IDE 插件(如 AnyRule)或在线正则工具(如 regex101.com)测试正则模式。
- 注意转义字符:Java 中需用
\\表示正则中的\(如\d→\\d)。
六、总结
正则表达式是处理字符串的 “瑞士军刀”,掌握其语法可大幅提升字符串处理效率。本文核心要点:
- 字符类(
[])和预定义字符(\d、\s等)用于匹配单个字符; - 数量词(
*、+、{n,m}等)控制字符重复次数; - 分组(
())实现子模式复用,支持复杂匹配; - 结合
matches()、replaceAll()、split()可实现校验、替换、切割等操作。
在实际开发中,正则表达式常用于表单验证、日志解析、文本清洗等场景,灵活运用可简化大量字符串处理代码。
Java 正则表达式:从基础到实战解析
1090

被折叠的 条评论
为什么被折叠?



