2026/2/20 6:37:44
网站建设
项目流程
郑州网站建设兼职,兰州建设厅评职称网站,微软哪个软件做网站,保山做网站建设目录
Java 正则前置须知
Java 正则常用语法分类详解
分类 1#xff1a;基础元字符#xff08;匹配单个字符#xff09;
分类 2#xff1a;量词#xff08;控制匹配次数#xff09;
关键区别#xff1a;贪婪 vs 非贪婪#xff08;实战重点#xff09;
分类 3基础元字符匹配单个字符分类 2量词控制匹配次数关键区别贪婪 vs 非贪婪实战重点分类 3字符类匹配指定范围的字符示例验证是否为小写字母分类 4边界匹配器匹配位置非字符关键示例完整验证手机号核心场景分类 5捕获组与非捕获组提取 / 复用内容1. 捕获组常用示例提取座机号的区号和号码2. 非捕获组仅匹配不提取学习Java爬虫时顺手补缺笔记。正则表达式学了不用经常忘记并且大部分工作可以直接ai因此这里要求够用能看到即可。Java 正则前置须知核心类Java 中操作正则依赖java.util.regex包下的两个类Pattern编译正则表达式Pattern.compile(regex)生成不可变的正则对象。Matcher执行匹配操作通过pattern.matcher(input)获取提供find()、group()等方法。关键转义Java 字符串中\是转义字符因此正则中的\必须写成\\双重转义例如原生正则\d匹配数字在 Java 中要写为\\d。原生正则\匹配双引号在 Java 中要写为\\\先转义\再转义。匹配流程编译正则 → 获取匹配器 → 执行匹配 → 提取结果对应你之前的代码逻辑。Java 正则常用语法分类详解分类 1基础元字符匹配单个字符元字符是正则的基础用于匹配单个特定字符或字符类型以下是最常用的元字符标注「原生正则」和「Java 写法」的区别。原生正则Java 写法含义说明适用示例..匹配除「换行符\n」外的任意单个字符匹配a、1、、/等\d\\d匹配单个数字0-9等价于[0-9]匹配手机号、身份证号中的数字\D\\D匹配单个非数字字符等价于[^0-9]提取字符串中的非数字部分\w\\w匹配单个「单词字符」字母、数字、下划线等价于[a-zA-Z0-9_]匹配变量名、用户名\W\\W匹配单个「非单词字符」等价于[^a-zA-Z0-9_]匹配标点符号、特殊符号\s\\s匹配单个空白字符空格、制表符\t、换行符\n等去除字符串中的多余空白\S\\S匹配单个非空白字符提取字符串中的有效内容排除空白\\\\\\匹配反斜杠\本身特殊字符需要转义匹配文件路径中的\\.\\.匹配小数点.本身.是元字符需转义匹配邮箱、URL 中的小数点示例代码匹配单个数字String regex \\d; // Java写法对应原生\d String input abc123def; Pattern pattern Pattern.compile(regex); Matcher matcher pattern.matcher(input); while (matcher.find()) { System.out.println(匹配到数字 matcher.group()); // 输出1、2、3 }分类 2量词控制匹配次数量词用于指定「前面的字符 / 元字符 / 捕获组」的匹配次数分为「贪婪匹配」默认尽可能多匹配和「非贪婪匹配」加?尽可能少匹配是正则的核心常用语法。语法含义说明贪婪 / 非贪婪示例Java 写法*匹配前面的内容 0 次或多次贪婪\\d*匹配 0 个或多个数字可空匹配前面的内容 1 次或多次贪婪\\d匹配 1 个或多个数字非空?匹配前面的内容 0 次或 1 次贪婪\\d?匹配 0 个或 1 个数字{n}匹配前面的内容恰好 n 次贪婪\\d{6}匹配恰好 6 个数字如验证码{n,}匹配前面的内容至少 n 次贪婪\\d{8,}匹配至少 8 个数字如密码{n,m}匹配前面的内容至少 n 次最多 m 次贪婪\\d{6,18}匹配 6-18 个数字如账号*?匹配前面的内容 0 次或多次非贪婪(.*?)你之前提取firstUrl用到的非贪婪捕获?匹配前面的内容 1 次或多次非贪婪\\d?匹配最少 1 个数字遇到非数字即停止关键区别贪婪 vs 非贪婪实战重点String input num1123num2456; // 贪婪匹配\\d尽可能多匹配直到最后一个数字 String greedyRegex num1(\\d); Matcher greedyMatcher Pattern.compile(greedyRegex).matcher(input); if (greedyMatcher.find()) { System.out.println(贪婪匹配结果 greedyMatcher.group(1)); // 输出123正确因为是非数字停止 } // 若输入为 num1123456贪婪和非贪婪结果一致若输入为 num1123num2456 String input2 num1123num2456; String nonGreedyRegex num1(\\d?); // 非贪婪匹配 Matcher nonGreedyMatcher Pattern.compile(nonGreedyRegex).matcher(input2); if (nonGreedyMatcher.find()) { System.out.println(非贪婪匹配结果 nonGreedyMatcher.group(1)); // 输出1最少匹配1个数字即停止 }分类 3字符类匹配指定范围的字符用[]包裹用于匹配「其中任意一个字符」支持范围指定和排除逻辑是验证场景的常用语法。语法含义说明Java 示例写法[abc]匹配a、b、c中的任意一个字符[abc]匹配单个小写字母 a/b/c[a-z]匹配任意一个小写英文字母a 到 z[a-z]范围匹配用-连接[A-Z]匹配任意一个大写英文字母A 到 Z[A-Z][0-9]匹配任意一个数字等价于\\d[0-9][a-zA-Z0-9]匹配任意一个大小写字母或数字等价于\\w不含下划线[a-zA-Z0-9][^abc]匹配除a、b、c之外的任意一个字符^表示排除[^abc][^0-9]匹配除数字之外的任意一个字符等价于\\D[^0-9]示例验证是否为小写字母String regex ^[a-z]$; // ^ 行首$ 行尾 至少1个 String input1 abc; String input2 Abc123; System.out.println(Pattern.matches(regex, input1)); // 输出true System.out.println(Pattern.matches(regex, input2)); // 输出false分类 4边界匹配器匹配位置非字符用于匹配「字符串 / 行的边界位置」不匹配具体字符常用于「完整验证」如手机号、邮箱的全量匹配。原生正则Java 写法含义说明适用场景^^匹配字符串的行首整个输入的开头验证字符串是否以指定内容开头$$匹配字符串的行尾整个输入的结尾验证字符串是否以指定内容结尾\b\\b匹配单词边界单词与非单词的分界提取单个单词、避免部分匹配\B\\B匹配非单词边界匹配单词内部的内容关键示例完整验证手机号核心场景// 手机号规则1开头第二位3-9后面9位数字完整匹配不能有多余字符 String phoneRegex ^1[3-9]\\d{9}$; String phone1 13812345678; String phone2 138123456789; // 多1位 String phone3 a13812345678; // 前面有多余字符 System.out.println(Pattern.matches(phoneRegex, phone1)); // true System.out.println(Pattern.matches(phoneRegex, phone2)); // false System.out.println(Pattern.matches(phoneRegex, phone3)); // false值得注意在Pattern.matches()中显式书写^和$是可选的因为方法本身会自动隐含完整匹配逻辑结果不受影响在Matcher.find()通用正则匹配中^和$是必不可少的用于实现「完整字符串验证」避免匹配到多余字符的子串分类 5捕获组与非捕获组提取 / 复用内容用()包裹用于「捕获匹配结果」或「分组匹配」分为「捕获组」可提取、可反向引用和「非捕获组」仅匹配不保存结果节省资源。1. 捕获组常用语法含义说明Java 示例(exp)普通捕获组编号从 1 开始按左括号顺序(\\d{3})-(\\d{8})匹配座机号分组 1 为区号分组 2 为号码(?nameexp)命名捕获组给捕获组起名字方便提取(?area\\d{3})-(?number\\d{8})命名 area 和 number\\n反向引用引用第 n 个捕获组的内容匹配与该组相同的内容(\\w)\\1匹配连续两个相同的单词字符如aa、11示例提取座机号的区号和号码String regex (\\d{3})-(\\d{8}); String input 北京区号010-12345678上海区号021-87654321; Pattern pattern Pattern.compile(regex); Matcher matcher pattern.matcher(input); while (matcher.find()) { System.out.println(完整座机号 matcher.group(0)); // 第0组整个匹配结果 System.out.println(区号 matcher.group(1)); // 第1组3位区号 System.out.println(号码 matcher.group(2)); // 第2组8位号码 }2. 非捕获组仅匹配不提取语法(?:exp)用于分组匹配但不需要保存结果适合复杂正则的分组逻辑避免多余的捕获组占用资源。// 匹配 abc 或 abd用非捕获组分隔无需提取分组结果 String regex ab(?:c|d); String input1 abc; String input2 abd; String input3 abe; System.out.println(Pattern.matches(regex, input1)); // true System.out.println(Pattern.matches(regex, input2)); // true System.out.println(Pattern.matches(regex, input3)); // false正则语法部分我觉得捕获组贪婪/非贪婪匹配边界匹配的概念知道就很够用了。如有疏漏与错误还请在评论区讨论交流