目录一、正则表达式基础概念二、正则常用语法核心元字符1. 基础匹配符2. 预定义字符集简写3. 量词控制字符出现次数4. 边界匹配符三、Java 正则核心 API 用法四、完整 Java 代码示例示例 1String 内置方法简单校验、分割、替换1.1 String.matches() 全串匹配最常用表单校验1.2 split() 正则分割字符串1.3 replaceAll() 正则替换示例 2Pattern Matcher 标准用法查找、分组2.1 基础查找 判断是否匹配2.2 分组捕获 ()重点提取指定片段示例 3贪婪匹配 vs 非贪婪匹配示例 4常用实战场景合集4.1 用户名校验字母开头6~16 位字母 / 数字 / 下划线4.2 去除所有空白符4.3 提取所有 URL简易版五、Java 正则使用最佳实践六、常见易错点一、正则表达式基础概念正则表达式Regular Expression简称 regex一种字符串匹配规则用来检索、匹配、替换、分割符合规则的文本广泛用于表单校验、日志解析、文本处理、爬虫等场景。Java 中正则核心包java.util.regex核心三类Pattern正则表达式编译对象不可变线程安全Matcher匹配器执行匹配、查找、替换PatternSyntaxException正则语法异常二、正则常用语法核心元字符1. 基础匹配符符号含义.匹配任意单个字符除换行符\n\转义符转义特殊字符\.匹配点\\匹配反斜杠[]字符集匹配括号内任意一个字符[^]否定字符集匹配不在括号内的字符或匹配左右任意一个表达式()分组将括号内视为一个整体可捕获分组内容2. 预定义字符集简写简写等价写法含义\d[0-9]数字\D[^0-9]非数字\w[a-zA-Z0-9_]字母、数字、下划线\W[^a-zA-Z0-9_]非单词字符\s[\t\n\r\f]空白符空格、制表符、换行\S[^\s]非空白符3. 量词控制字符出现次数符号含义?出现0 次 或 1 次可有可无出现至少 1 次*出现0 次、1 次、多次{n}精准出现n 次{n,}至少 n 次{n,m}n ~ m 次包含两端贪婪 / 非贪婪默认贪婪匹配尽可能多匹配加?变为非贪婪尽可能少匹配例.*?4. 边界匹配符符号含义^行开头$行结尾\b单词边界完整字符串校验必须加^和$否则会部分匹配。三、Java 正则核心 API 用法Java 中使用正则有三种常用方式String自带方法matches()/split()/replaceAll()简单场景Pattern Matcher复杂匹配、分组、多次查找主流分组捕获、循环查找、替换回调重要提醒Java 字符串中\必须转义为\\例正则\d→ Java 字符串写为\\d四、完整 Java 代码示例示例 1String 内置方法简单校验、分割、替换1.1String.matches()全串匹配最常用表单校验public class RegexDemo { public static void main(String[] args) { // 1. 校验纯数字^ 开头 $ 结尾1个及以上数字 String numReg ^\\d$; String str1 123456; String str2 123abc; System.out.println(str1.matches(numReg)); // true System.out.println(str2.matches(numReg)); // false // 2. 校验手机号国内11位以1开头 String phoneReg ^1[3-9]\\d{9}$; String phone1 13800138000; String phone2 12345678901; System.out.println(phone1.matches(phoneReg)); // true System.out.println(phone2.matches(phoneReg)); // false // 3. 校验邮箱简易版 String emailReg ^\\w\\w(\\.\\w)$; String email testqq.com; System.out.println(email.matches(emailReg)); // true } }1.2split()正则分割字符串// 按 数字/空格/逗号 分割 String content Java123Python,Go C; String[] arr content.split([\\d,\\s]); for (String s : arr) { System.out.print(s ); // Java Python Go C }1.3replaceAll()正则替换String text 密码123编号456数字789; // 把所有数字替换为 * String res text.replaceAll(\\d, *); System.out.println(res); // 密码*编号*数字*示例 2Pattern Matcher 标准用法查找、分组适用于提取内容、分组捕获、全局查找2.1 基础查找 判断是否匹配import java.util.regex.Matcher; import java.util.regex.Pattern; public class PatternMatcherDemo { public static void main(String[] args) { String content 订单号ORD20260613单号ORD999888; // 正则匹配 ORD 6位数字 String reg ORD\\d{6}; // 1. 编译正则建议复用 Pattern提升性能 Pattern pattern Pattern.compile(reg); Matcher matcher pattern.matcher(content); // 2. 查找所有匹配项循环查找 while (matcher.find()) { // group() 获取当前匹配到的完整字符串 String orderNo matcher.group(); System.out.println(匹配到订单号 orderNo); } } }输出匹配到订单号ORD202606 匹配到订单号ORD9998882.2 分组捕获()重点提取指定片段语法group(0)匹配整个正则结果group(1)第一个()分组group(2)第二个()分组需求提取姓名-年龄格式文本中的姓名和年龄public class GroupDemo { public static void main(String[] args) { String text 张三-25李四-30王五-28; String reg (\\w)-(\\d); // 分组1姓名分组2年龄 Pattern pattern Pattern.compile(reg); Matcher matcher pattern.matcher(text); while (matcher.find()) { String name matcher.group(1); String age matcher.group(2); System.out.println(姓名 name 年龄 age); } } }输出姓名张三年龄25 姓名李四年龄30 姓名王五年龄28示例 3贪婪匹配 vs 非贪婪匹配public class LazyRegex { public static void main(String[] args) { String html div内容1/divdiv内容2/div; // 1. 贪婪匹配 .* 一次性匹配到最后 String greedyReg div.*/div; Pattern p1 Pattern.compile(greedyReg); Matcher m1 p1.matcher(html); while (m1.find()) { System.out.println(贪婪 m1.group()); // 输出div内容1/divdiv内容2/div } // 2. 非贪婪匹配 .*? 最短匹配 String lazyReg div.*?/div; Pattern p2 Pattern.compile(lazyReg); Matcher m2 p2.matcher(html); while (m2.find()) { System.out.println(非贪婪 m2.group()); // 分行输出两个div } } }示例 4常用实战场景合集4.1 用户名校验字母开头6~16 位字母 / 数字 / 下划线规则首字符字母后续字母数字下划线总长度 6-16String usernameReg ^[a-zA-Z]\\w{5,15}$; String u1 user_123; String u2 123user; System.out.println(u1.matches(usernameReg)); // true System.out.println(u2.matches(usernameReg)); // false4.2 去除所有空白符String str Java Regex Demo \t\n; String result str.replaceAll(\\s, ); System.out.println(result); // JavaRegexDemo4.3 提取所有 URL简易版String content 官网https://www.baidu.com 文档http://doc.java.com; String urlReg http[s]?://\\w(\\.\\w); Pattern p Pattern.compile(urlReg); Matcher m p.matcher(content); while (m.find()) { System.out.println(URL m.group()); }五、Java 正则使用最佳实践优先复用 Pattern 对象Pattern.compile()编译开销大全局正则建议静态常量定义不要在循环内反复编译。// 全局静态只编译一次 private static final Pattern PHONE_PATTERN Pattern.compile(^1[3-9]\\d{9}$);全串校验必须加^和$不加会出现 “部分匹配” 漏洞例如正则\\d会认为abc123是合法数字。特殊字符必须转义. * ? ( ) [ ] \等在正则中有特殊含义匹配字面量时用\\转义。分组不要滥用不需要捕获的分组使用非捕获分组(?:表达式)不占用分组编号性能更好。 例(?:\\.\\w)非捕获分组。复杂正则拆分注释 Java 支持正则注释模式Pattern.COMMENTS可写备注。六、常见易错点Java 字符串\→ 正则\\两层转义。matches()是全串匹配find()是片段查找。.*贪婪匹配解析标签 / 括号务必用.*?非贪婪。\s包含换行、制表符单纯匹配空格用 即可。