2015-05-12 3 views
2

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

String path = "/path/to/file.txt.tar.gz"; 
  1. Expression 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. Любая помощь будет оценена по достоинству.

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

+1

Если вы ищете '.tar. gz' и '.gz', вы не просто ищете' .gz'? Все '.tar.gz' будут пойманы выражением, которое ловит' .gz'. –

+0

Незначительный комментарий. Ваш '[\\. Tar]' должен, вероятно, быть '(\\. Tar)', поскольку '[...]' представляет собой группу символов. – aioobe

ответ

1

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

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

И

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

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

DEMO

4

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

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

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

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

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

То же, что и выше! Спасибо, он (очевидно) работает тоже! – Giovanni