Расширение файла Java Regex

Я должен проверить, заканчивается ли имя файла расширением gzip. В частности, я ищу два расширения: ".tar.gz" и ".gz". Я хотел бы зафиксировать имя файла (и путь) как группу, используя одно регулярное выражение, исключая расширение gzip, если оно есть. Я протестировал следующие регулярные выражения на этом примере пути

String path = "/path/to/file.txt.tar.gz";
  1. Выражение 1:

    String rgx = "(.+)(?=([\\.tar]?\\.gz)$)";
    
  2. Выражение 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. Любая помощь будет оценена.

заранее спасибо


person Giovanni    schedule 12.05.2015    source источник
comment
Если вы ищете .tar.gz и .gz, разве вы не ищете только .gz? Все .tar.gz будут перехватываться выражением, которое перехватывает .gz.   -  person Captain Man    schedule 12.05.2015
comment
Небольшой комментарий. Ваш [\\.tar], вероятно, должен быть (\\.tar), так как [...] представляет группу символов.   -  person aioobe    schedule 12.05.2015


Ответы (3)


Вы можете использовать следующую идиому, чтобы сопоставить как ваш путь + имя файла, так и расширения 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 
person Mena    schedule 12.05.2015

Вам нужно сделать часть, которая соответствует имени файла неохотно, т.е. изменить (.+) на (.+?):

String rgx = "^(.+?)(\\.tar)?\\.gz";
//              ^^^

Теперь вы получаете:

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

Используйте регулярное выражение на основе группы захвата.

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

А также,

Получить путь из индекса 1.

Получить имя файла из индекса 2.

ДЕМО

person Avinash Raj    schedule 12.05.2015