正向预查((?=...))匹配位置而非内容,要求该位置后紧接指定模式但不消耗字符;如d+(?=px)只匹配数字部分,不包含px。
在 java 中,正向预查(positive lookahead)用 (?=...) 表示,它匹配某个位置,要求该位置**之后紧跟着指定模式**,但**不消耗字符、不包含该模式本身**。也就是说,它只做“检查”,不“抓取”。这非常适合提取“出现在某模式之前”的内容,且不把那个模式带进来。
核心原理:位置匹配,非内容匹配
正向预查不是匹配一段文本,而是匹配一个“位置”——这个位置后面必须能匹配上你写的子表达式。Java 的 Pattern 和 Matcher 会把这个位置当作匹配起点,但不会把预查部分计入 group(0) 或后续分组。
- 例如:
\d+(?=px)匹配数字,但仅限后面紧跟px的情况;匹配结果只有数字,不含px - 注意:
lookahead不移动正则引擎的读取指针,所以可用于重叠匹配或条件过滤
常见实用场景与写法
提取单位前的数值(如 CSS 尺寸)
字符串:"width: 120px; height: 3.5em; font-size: 16px;"
想取出所有后面跟 px 的数字(不含 px):
String regex = "\d+(?=px)"; // 匹配一个或多个数字,且其后是 "px"
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher("width: 120px; font-size: 16px;");
while (m.find()) {
System.out.println(m.group()); // 输出:120、16
}
匹配以特定词结尾但不包含结尾词的前缀
比如提取所有以 Manager 结尾的职位名中,“Manager” 前面的部分:
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
String regex = "\w+(?=(?:Manager|Director))"; // 匹配单词字符序列,后面必须是 "Manager" 或 "Director" // 注意:这里用了非捕获分组 (?:...) 避免干扰分组编号
对 "SeniorManager", "TechDirector",分别匹配出 "Senior"、"Tech"。
注意事项与避坑点
正向预查在 Java 中生效,但需注意以下细节:
- Java 默认不支持
lookbehind的无限长度(即(? 中不能有 <code>*或+),但lookahead没此限制 - 预查内容**不参与捕获**,所以
m.group(0)永远不包含(?=...)里的内容 - 如果需要同时提取“前面的内容 + 后面的模式”,应改用捕获分组,例如
(\w+)(?=Manager)—— 这时group(1)是你要的部分 - 避免过度使用嵌套预查,可读性会下降;简单逻辑优先考虑分组 + 条件判断
对比:为什么不用 split 或 substring?
直接字符串切分看似简单,但在复杂文本中容易出错:
- 目标模式可能多次出现(如
px出现在注释或字符串字面量中) - 前后可能有空格、括号、引号等干扰格式
- 正则预查天然支持上下文约束(如
(? 要求数字前是空白符)
正则预查提供的是**基于上下文的精确位置断言**,比纯字符串操作更健壮、更声明式。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










