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