Java正则表达式文件扩展名

Java正则表达式文件扩展名,java,regex,gzip,file-extension,Java,Regex,Gzip,File Extension,我必须检查文件名是否以gzip扩展名结尾。特别是我正在寻找两个扩展:“.tar.gz”和“.gz”。我想使用一个正则表达式将文件名(和路径)捕获为一个组,不包括gzip扩展名(如果有的话)。 我在这个示例路径上测试了以下正则表达式 String path = "/path/to/file.txt.tar.gz"; 表达1: String rgx = "(.+)(?=([\\.tar]?\\.gz)$)"; 表达2: String rgx = "^(.+)[\\.tar]?\\.gz$";

我必须检查文件名是否以gzip扩展名结尾。特别是我正在寻找两个扩展:“.tar.gz”和“.gz”。我想使用一个正则表达式将文件名(和路径)捕获为一个组,不包括gzip扩展名(如果有的话)。 我在这个示例路径上测试了以下正则表达式

String path = "/path/to/file.txt.tar.gz";
  • 表达1:

    String rgx = "(.+)(?=([\\.tar]?\\.gz)$)";
    
  • 表达2:

    String rgx = "^(.+)[\\.tar]?\\.gz$";
    
  • 以这种方式提取组1:

    Matcher m = Pattern.compile(rgx).matcher(path);           
    if(m.find()){
       System.out.println(m.group(1));
    }
    
    两个正则表达式都给出了相同的结果:
    /path/to/file.txt.tar
    而不是
    /path/to/file.txt
    。 任何帮助都将不胜感激


    提前感谢

    使用基于捕获组的正则表达式

    ^(.+)/(.+)(?:\\.tar)?\\.gz$
    
    以及

    从索引1获取路径

    从索引2中获取文件名


    您可以使用以下习惯用法一次性匹配路径+文件名和gzip扩展名:

    String[] inputs = {
            "/path/to/foo.txt.tar.gz", 
            "/path/to/bar.txt.gz",
            "/path/to/nope.txt"
     };
    //                           ┌ group 1: any character reluctantly quantified
    //                           |    ┌ group 2
    //                           |    | ┌ optional ".tar"
    //                           |    | |       ┌ compulsory ".gz"
    //                           |    | |       |     ┌ end of input
    Pattern p = Pattern.compile("(.+?)((\\.tar)?\\.gz)$");
    for (String s: inputs) {
        Matcher m = p.matcher(s);
        if (m.find()) {
            System.out.printf("Found: %s --> %s %n", m.group(1), m.group(2));
        }
    }
    
    输出

    Found: /path/to/foo.txt --> .tar.gz 
    Found: /path/to/bar.txt --> .gz 
    

    您需要制作与文件名匹配的零件,即将
    (.+)
    更改为
    (.+?)

    现在您可以:

    Matcher m = Pattern.compile(rgx).matcher(path);           
    if(m.find()){
       System.out.println(m.group(1));   //   /path/to/file.txt
    }
    

    如果你在找
    .tar.gz
    .gz
    ,你不是在找
    .gz
    ?所有
    .tar.gz
    都将被捕获
    .gz
    次要注释的表达式捕获。您的
    [\\.tar]
    可能应该是
    (\\.tar)
    ,因为
    […]
    表示字符组。
    Matcher m = Pattern.compile(rgx).matcher(path);           
    if(m.find()){
       System.out.println(m.group(1));   //   /path/to/file.txt
    }