
本文介绍如何在java中通过正则表达式精准提取文件名的中间段(如从"aa_bb_cc_20-300.tsv"中提取"cc_20-300"),涵盖模式设计原理、完整可运行代码及关键注意事项。
本文介绍如何在java中通过正则表达式精准提取文件名的中间段(如从"aa_bb_cc_20-300.tsv"中提取"cc_20-300"),涵盖模式设计原理、完整可运行代码及关键注意事项。
在实际文件处理场景中,常需从带分隔符(如下划线 _)和扩展名(如 .tsv)的文件名中提取特定语义段——例如保留倒数第二、三段组合,而剔除固定前缀与后缀。此时,硬编码 split() 易受段数变化影响,而正则表达式能以声明式方式精准定位目标结构。
正则模式解析
针对示例文件名 AA_BB_CC_20-300.tsv,目标是提取 CC_20-300,即:跳过前两个下划线分隔段,捕获后续直到点号前的所有内容。推荐正则模式为:
^[^_]+_[^_]+_([^_]+_[^_]+)\..*$
- ^:字符串起始锚点
- [^_]+:匹配一个或多个非下划线字符(即第一段 AA)
- _:字面量下划线
- [^_]+:第二段 BB
- _:第二个下划线
- ([^_]+_[^_]+):捕获组,匹配“非下划线段 + 下划线 + 非下划线段”,即 CC_20-300(注意:20-300 中的 - 属于 [^_]+ 允许的字符)
- \.:字面量点号(需转义)
- .*:匹配扩展名剩余部分(如 tsv)
- $:字符串结束锚点
该模式强约束了结构:必须以两段前缀开头、紧接目标段(含一个下划线)、再以点号分隔扩展名。
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
完整实现代码
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class FilenameExtractor {
public static void main(String[] args) {
String filename = "AA_BB_CC_20-300.tsv";
// 正则:跳过前两段,捕获第三、四段(含中间下划线),忽略扩展名
String patternString = "^[^_]+_[^_]+_([^_]+_[^_]+)\..*$";
Pattern pattern = Pattern.compile(patternString);
Matcher matcher = pattern.matcher(filename);
if (matcher.find()) {
String extracted = matcher.group(1); // 获取捕获组内容
System.out.println("Extracted: " + extracted); // 输出:CC_20-300
} else {
System.err.println("Filename format mismatch: '" + filename + "'");
}
}
}
注意事项与健壮性建议
- ✅ 扩展名兼容性:模式中的 \..*$ 可匹配任意扩展名(.csv, .txt 等),无需修改。
- ⚠️ 段数严格性:当前模式要求文件名恰好包含4段主内容(AA/BB/CC/20-300)。若实际数据段数不固定(如 X_Y_Z_A_B.tsv),应改用更灵活策略:
// 示例:提取最后两段(推荐用于动态段数) String flexiblePattern = "^(?:[^_]+_){2}((?:[^_]+_)*[^_]+)\..*$"; // 或直接用 split() + 数组索引(更易读): String[] parts = filename.substring(0, filename.lastIndexOf('.')).split("_"); if (parts.length >= 2) { String result = String.join("_", parts[parts.length-2], parts[parts.length-1]); } - ? 空值防护:生产环境务必检查 matcher.find() 结果,避免 group(1) 抛出 IllegalStateException。
- ? 测试覆盖:建议补充边界用例验证,如 A_B_C_D_E.log(应失败)、AA_BB_CC.tsv(应失败,因目标段不足)。
掌握此正则逻辑后,您可根据业务需求快速调整捕获组范围——例如提取最后三段,只需将 ([^_]+_[^_]+) 改为 ([^_]+_[^_]+_[^_]+)。正则不是银弹,但对结构化文件名处理,它提供了简洁、高效且可复用的解决方案。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










