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

时间:2009-06-02 18:55:03

标签: java string process

在Java中修剪后缀的最有效方法是什么,如下所示:

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

21 个答案:

答案 0 :(得分:257)

这是我们不应该自己做的那种代码。使用库来获取平凡的东西,为大脑保存你的大脑。

在这种情况下,我建议您使用FilenameUtils.removeExtension()

中的Apache Commons IO

答案 1 :(得分:216)

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

答案 2 :(得分:84)

由于在单行中使用String.substringString.lastIndex是好的,因此在处理某些文件路径方面存在一些问题。

以下面的路径为例:

a.b/c

使用单行将导致:

a

这是不正确的。

结果应该是c,但由于文件没有扩展名,但路径中有一个名称中带有.的目录,因此单行方法被欺骗了作为文件名的路径,这是不正确的。

需要支票

受到skaffman's answer的启发,我查看了FilenameUtils.removeExtensionApache Commons IO方法。

为了重新创建它的行为,我写了一些新方法应该完成的测试,其中包括:

Path                  Filename
--------------        --------
a/b/c                 c
a/b/c.jpg             c
a/b/c.jpg.jpg         c.jpg

a.b/c                 c
a.b/c.jpg             c
a.b/c.jpg.jpg         c.jpg

c                     c
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);
}

使用上述测试运行此removeExtension方法会产生上面列出的结果。

使用以下代码测试该方法。由于这是在Windows上运行的,因此路径分隔符为\,当用作\文字的一部分时,必须使用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("a.b\\c"));
System.out.println(removeExtension("a.b\\c.jpg"));
System.out.println(removeExtension("a.b\\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

结果是该方法应该满足的测试中概述的预期结果。

答案 3 :(得分:16)

String foo = "title part1.txt";
foo = foo.substring(0, foo.lastIndexOf('.'));

答案 4 :(得分:16)

顺便说一下,在我的情况下,当我想要一个快速解决方案来删除特定扩展时,这大致就是我所做的:

  if (filename.endsWith(ext))
    return filename.substring(0,filename.length() - ext.length());
  else
    return filename;

答案 5 :(得分:6)

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

我想不出更快的方式。

答案 6 :(得分:5)

我发现coolbird's answer特别有用。

但我将最后的结果陈述改为:

if (extensionIndex == -1)
  return s;

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

因为我想要返回完整的路径名。

So "C:\Users\mroh004.COM\Documents\Test\Test.xml" becomes 
   "C:\Users\mroh004.COM\Documents\Test\Test" and not
   "Test"

答案 7 :(得分:5)

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

答案 8 :(得分:4)

如果您的项目已经依赖于Google核心库,请使用com.google.common.io.Files类中的方法。您需要的方法是getNameWithoutExtension

答案 9 :(得分:2)

使用正则表达式。这个替换了最后一个点,以及它之后的所有内容。

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

如果要预编译正则表达式,也可以创建Pattern对象。

答案 10 :(得分:1)

使用字符串图像路径创建新文件

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 "";
        }
    }

答案 11 :(得分:1)

你可以尝试这个功能,非常基本

public String getWithoutExtension(String fileFullPath){
    return fileFullPath.substring(0, fileFullPath.lastIndexOf('.'));
}

答案 12 :(得分:1)

migrate.exe

答案 13 :(得分:1)

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 = '\\';

答案 14 :(得分:1)

String[] splitted = fileName.split(".");
String fileNameWithoutExtension = fileName.replace("." + splitted[splitted.length - 1], "");

答案 15 :(得分:0)

请记住没有文件扩展名或有多个文件扩展名的情况

示例文件名:文件| file.txt | file.tar.bz2

>>> a1 = [0, 2, 4, 6, 8]
>>> b2 = [1, 3, 5, 7, 9]
>>> dct = {'A': a1, 'B': b2}
>>> d = {x: k for k, v in dct.items() for x in v}    
>>> d
{0: 'A', 2: 'A', 4: 'A', 6: 'A', 8: 'A', 1: 'B', 3: 'B', 5: 'B', 7: 'B', 9: 'B'}
>>> c = [2, 8, 5]
>>> "".join(d[x] for x in c)
'AAB'

答案 16 :(得分:0)

我会这样做:

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);

直到''开始到结束。然后调用substring。

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

答案 17 :(得分:0)

String img = "example.jpg";
// String imgLink = "http://www.example.com/example.jpg";
URI uri = null;

try {
    uri = new URI(img);
    String[] segments = uri.getPath().split("/");
    System.out.println(segments[segments.length-1].split("\\.")[0]);
} catch (Exception e) {
    e.printStackTrace();
}

这将为 img imgLink

输出示例

答案 18 :(得分:0)

public static String removeExtension(String file) {
    if(file != null && file.length() > 0) {
        while(file.contains(".")) {
            file = file.substring(0, file.lastIndexOf('.'));
        }
    }
    return file;
}

答案 19 :(得分:0)

为了坚持 Path 类,我能写出的最好的东西:

Path removeExtension(Path path) {
    return path.resolveSibling(path.getFileName().toString().replaceFirst("\\.[^.]*$", ""));
}

答案 20 :(得分:0)

private String trimFileName(String fileName)
    {
        String[] ext;
        ext = fileName.split("\\.");
        
        return fileName.replace(ext[ext.length - 1], "");

    }

这段代码会将文件名分成带有“.”的部分,例如。如果文件名是 file-name.hello.txt 则它会被拆分成字符串数组,如 , { "file-name", "hello", "txt" }。所以无论如何,这个字符串数组中的最后一个元素将是那个特定文件的文件扩展名,所以我们可以简单地用 arrayname.length - 1 找到任何数组的最后一个元素,所以在我们知道最后一个元素之后,我们可以用该文件名中的空字符串替换文件扩展名。最后这将返回文件名.hello。 , 如果您还想删除最后一个句点,那么您可以将只有句点的字符串添加到返回行中字符串数组的最后一个元素。应该是这样的,

return fileName.replace("." +  ext[ext.length - 1], "");