正则表达式详解 + Java 实战示例

正则表达式详解 + Java 实战示例 目录一、正则表达式基础概念二、正则常用语法核心元字符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包含换行、制表符单纯匹配空格用 即可。