如何使用正则提取不带点的zip/tar/tar.gz文件扩展名(Java环境)
解决方案
方案1:调整分组结构(推荐)
直接把扩展名前的点移到分组外,让第二个分组直接捕获不带点的后缀,兼容你需要的zip/tar/tar.gz三种格式:
正则表达式:(.*)\.(tar(?:\.gz)?|zip)
- 分组1:依旧匹配完整文件名(不含后缀)
- 分组2:直接返回不带点的扩展名,不需要额外字符串处理
- 非捕获组
(?:\.gz)不会占用分组序号,完全保留你原有2个分组的使用习惯,不需要修改后续取分组的业务代码
Java使用示例:
import java.util.regex.Matcher; import java.util.regex.Pattern; public class ExtParseTest { public static void main(String[] args) { Pattern pattern = Pattern.compile("(.*)\\.(tar(?:\\.gz)?|zip)"); // 测试用例 String[] testFiles = {"report.zip", "data.tar", "backup.tar.gz"}; for (String file : testFiles) { Matcher matcher = pattern.matcher(file); if (matcher.matches()) { System.out.println("文件名:" + matcher.group(1)); System.out.println("扩展名:" + matcher.group(2)); } } } }
输出结果:
文件名:report 扩展名:zip 文件名:data 扩展名:tar 文件名:backup 扩展名:tar.gz
方案2:零宽断言实现(不改动原有分组逻辑)
如果你不想调整原有分组的位置结构,可以用正向零宽后发断言,限定匹配内容的前一位是点,不需要额外捕获:
正则表达式:(.*)(?<=\.)(zip|tar\.gz|tar)
使用逻辑和方案1完全一致,分组2直接返回不带点的扩展名。
内容的提问来源于stack exchange,提问作者zepol
相关产品推荐
相关产品推荐

