如何从Java中的string修剪文件扩展名?

在Java中修改后缀的最有效的方法是什么?

title part1.txt title part2.html => title part1 title part2 

这是我们不应该自己做的那种代码。 使用图书馆为世俗的东西,保存你的大脑的困难的东西。

在这种情况下,我build议使用Apache Commons IO中的 FilenameUtils.removeExtension()

 str.substring(0, str.lastIndexOf('.')) 

由于在一行中使用String.substringString.lastIndex是很好的,所以在处理某些文件path方面存在一些问题。

以下面的path为例:

 ab/c 

使用单行将导致:

 a 

这是不正确的。

结果应该是c ,但由于文件缺less扩展名,但path中有一个目录. 在这个名字里面,单线程的方法被欺骗,把path的一部分作为文件名,这是不正确的。

需要检查

受到skaffman的回答的启发,我看了一下Apache Commons IO的FilenameUtils.removeExtension方法。

为了重现它的行为,我写了一些新的方法应该实现的testing,它们是:

path文件名
 -------------- --------
的a / b / cc的
 a / b / c.jpg c
 a / b / c.jpg.jpg c.jpg

 AB / cc的
 ab / c.jpg c
 ab / c.jpg.jpg c.jpg

 CC
 c.jpg c
 c.jpg.jpg c.jpg

(这就是我所检查的一切 – 可能还有其他检查应该到位,我忽略了。)

执行

以下是我的removeExtension方法的实现:

 public static String removeExtension(String s) { String separator = System.getProperty("file.separator"); String filename; // Remove the path upto the filename. int lastSeparatorIndex = s.lastIndexOf(separator); if (lastSeparatorIndex == -1) { filename = s; } else { filename = s.substring(lastSeparatorIndex + 1); } // Remove the extension. int extensionIndex = filename.lastIndexOf("."); if (extensionIndex == -1) return filename; return filename.substring(0, extensionIndex); } 

用上面的testing运行这个removeExtension方法将得到上面列出的结果。

该方法用以下代码进行testing。 由于这是在Windows上运行的,path分隔符是一个\ ,当用作String文字的一部分时,它必须用\转义。

 System.out.println(removeExtension("a\\b\\c")); System.out.println(removeExtension("a\\b\\c.jpg")); System.out.println(removeExtension("a\\b\\c.jpg.jpg")); System.out.println(removeExtension("ab\\c")); System.out.println(removeExtension("ab\\c.jpg")); System.out.println(removeExtension("ab\\c.jpg.jpg")); System.out.println(removeExtension("c")); System.out.println(removeExtension("c.jpg")); System.out.println(removeExtension("c.jpg.jpg")); 

结果是:

 c c c.jpg c c c.jpg c c c.jpg 

结果是在方法应该满足的testing中列出的期望的结果。

顺便说一句,在我的情况下,当我想要一个快速的解决scheme,删除一个特定的扩展,这大概是我所做的:

  if (filename.endsWith(ext)) return filename.substring(0,filename.length() - ext.length()); else return filename; 
 String foo = "title part1.txt"; foo = foo.substring(0, foo.lastIndexOf('.')); 
 String fileName="foo.bar"; int dotIndex=fileName.lastIndexOf('.'); if(dotIndex>=0) { // to prevent exception if there is no dot fileName=fileName.substring(0,dotIndex); } 

这是一个诡计的问题吗? :p

我想不到更快的方式。

 filename.substring(filename.lastIndexOf('.'), filename.length()).toLowerCase(); 

我发现coolbird的答案特别有用。

但是我把最后的结果语句改为:

 if (extensionIndex == -1) return s; return s.substring(0, lastSeparatorIndex+1) + filename.substring(0, extensionIndex); 

因为我想要返回完整的path名称。

 因此“C:\ Users \ mroh004.COM \ Documents \ Test \ Test.xml”变成了 
    “C:\ Users \ mroh004.COM \ Documents \ Test \ Test”而不是
    “testing”
 String[] splitted = fileName.split("."); String fileNameWithoutExtension = fileName.replace("." + splitted[splitted.length - 1], ""); 

用string图像path创build一个新的文件

 String imagePath; File test = new File(imagePath); test.getName(); test.getPath(); getExtension(test.getName()); public static String getExtension(String uri) { if (uri == null) { return null; } int dot = uri.lastIndexOf("."); if (dot >= 0) { return uri.substring(dot); } else { // No extension. return ""; } } 

org.apache.commons.io.FilenameUtils 2.4版给出了以下答案

 public static String removeExtension(String filename) { if (filename == null) { return null; } int index = indexOfExtension(filename); if (index == -1) { return filename; } else { return filename.substring(0, index); } } public static int indexOfExtension(String filename) { if (filename == null) { return -1; } int extensionPos = filename.lastIndexOf(EXTENSION_SEPARATOR); int lastSeparator = indexOfLastSeparator(filename); return lastSeparator > extensionPos ? -1 : extensionPos; } public static int indexOfLastSeparator(String filename) { if (filename == null) { return -1; } int lastUnixPos = filename.lastIndexOf(UNIX_SEPARATOR); int lastWindowsPos = filename.lastIndexOf(WINDOWS_SEPARATOR); return Math.max(lastUnixPos, lastWindowsPos); } public static final char EXTENSION_SEPARATOR = '.'; private static final char UNIX_SEPARATOR = '/'; private static final char WINDOWS_SEPARATOR = '\\'; 
  private String trimFileExtension(String fileName) { String[] splits = fileName.split( "\\." ); return StringUtils.remove( fileName, "." + splits[splits.length - 1] ); } 

我会这样做:

 String title_part = "title part1.txt"; int i; for(i=title_part.length()-1 ; i>=0 && title_part.charAt(i)!='.' ; i--); title_part = title_part.substring(0,i); 

从开始到结束直到'。' 然后调用子串。

编辑:可能不是一个高尔夫,但它是有效的:)

使用正则expression式。 这个取代了最后一个点,以及之后的所有内容。

 String baseName = fileName.replaceAll("\\.[^.]*$", ""); 

如果要预编译正则expression式,也可以创build一个Pattern对象。