在Java中如何从字符串中修剪文件扩展名?
在Java中修剪后缀最有效的方法是什么,如下所示:在Java中如何从字符串中修剪文件扩展名?,java,string,process,Java,String,Process,在Java中修剪后缀最有效的方法是什么,如下所示: title part1.txt title part2.html => title part1 title part2 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.substri
title part1.txt
title part2.html
=>
title part1
title part2
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);
我想这样做:
title part1.txt
title part2.html
=>
title part1
title part2
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);
从结尾到“.”然后调用子字符串
编辑:
可能不是高尔夫,但很有效:)
这是个骗人的问题吗p
我想不出比atm更快的方法。这是我们不应该自己编写的代码。用图书馆来处理日常琐事,把你的大脑用来处理困难的事情
在这种情况下,我建议使用from,因为在一行中使用
String.substring
和String.lastIndex
很好,在处理某些文件路径方面存在一些问题
以以下路径为例:
a.b/c
使用一个衬里将导致:
a
那是不对的
结果应该是c
,但由于文件缺少扩展名,但路径有一个名为
的目录,因此单行程序方法被欺骗,将路径的一部分作为文件名,这是不正确的
需要检查
受此启发,我看了一下这个方法
为了重新创建其行为,我编写了一些新方法应该完成的测试,如下所示:
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
方法将产生上面列出的结果
使用以下代码对该方法进行了测试。由于这是在Windows上运行的,因此路径分隔符是\
,当用作字符串的一部分时,必须使用\
对其进行转义
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
结果是该方法应达到的测试中概述的预期结果。我发现特别有用
但我将最后的结果声明更改为:
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"
所以“C:\Users\mroh004.COM\Documents\Test\Test.xml”变成
“C:\Users\mroh004.COM\Documents\Test\Test”而不是
“测试”
顺便说一句,在我的例子中,当我想要一个快速的解决方案来删除一个特定的扩展时,我大概就是这么做的:
if (filename.endsWith(ext))
return filename.substring(0,filename.length() - ext.length());
else
return filename;
使用字符串图像路径创建新文件
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 = '\\';
使用正则表达式。这一个替换了最后一个点,以及它之后的所有内容
String baseName = fileName.replaceAll("\\.[^.]*$", "");
如果要预编译正则表达式,还可以创建模式对象。请记住没有文件扩展名或有多个文件扩展名的情况
文件名示例:file | file.txt | file.tar.bz2
/**
*
* @param fileName
* @return file extension
* example file.fastq.gz => fastq.gz
*/
private String extractFileExtension(String fileName) {
String type = "undefined";
if (FilenameUtils.indexOfExtension(fileName) != -1) {
String fileBaseName = FilenameUtils.getBaseName(fileName);
int indexOfExtension = -1;
while (fileBaseName.contains(".")) {
indexOfExtension = FilenameUtils.indexOfExtension(fileBaseName);
fileBaseName = FilenameUtils.getBaseName(fileBaseName);
}
type = fileName.substring(indexOfExtension + 1, fileName.length());
}
return type;
}
如果您的项目已经依赖于google核心库,请使用com.google.common.io.Files
类中的方法。您需要的方法是getNameWithoutExtension
您可以尝试此功能,非常基本
public String getWithoutExtension(String fileFullPath){
return fileFullPath.substring(0, fileFullPath.lastIndexOf('.'));
}
这将为img和imgLink输出示例,如果您使用Spring,您可以使用
public static String removeExtension(String file) {
if(file != null && file.length() > 0) {
while(file.contains(".")) {
file = file.substring(0, file.lastIndexOf('.'));
}
}
return file;
}
org.springframework.util.StringUtils.stripFilenameExtension(String path)
从给定的Java资源路径中删除文件扩展名,例如
“mypath/myfile.txt”->“mypath/myfile”
Params:path–文件路径
返回:扩展名为stripped的路径
我能写的最好的东西就是坚持使用Path类:
Path removeExtension(Path path) {
return path.resolveSibling(path.getFileName().toString().replaceFirst("\\.[^.]*$", ""));
}
高效的代码智慧,是你的意思,我希望不是CPU智慧他不是问如何做,他是问什么是最有效的方式。我来这里也是为了同样的事情。这就是lastIndexOf所做的;为什么要重新发明轮子?为了好玩,也为了有点描述性。就这样。(我写这篇文章的时候忘记了lastIndexOf)不,可能不止一个';您需要lastIndexOf('.')-1,因为没有使用我以为您正在使用的方法。现在我的总积分是+0。快换这应该分配给一个新变量,因为str没有被修改。小心处理:如果文件名没有后缀,它会向您抛出一个异常。archive.tar.bz2呢?if(str.contains(“.”)
str.substring(0,str.lastIndexOf(“.”)
if(str!=null&&str.contains(“.”)str.substring(0,str.lastIndexOf(“))。FilenameUtils是另一个依赖项,并不总是在应答时可用。使用System.getProperty(“file.separator”)
而不仅仅是file.separator
有什么特别的原因吗?警告一句:此解决方案还删除了前面的路径,而不仅仅是扩展名,与Apache Commons IO方法不同。对于与要求相反的/path/to/.htaccess
来说,这可能会失败,并且不需要传递长度,只需使用一个arg substringNeed to split on“\\”。“
as.”是正则表达式的特殊选项。对于95%的项目,这应该是可接受的答案。像这样重写代码是许多头痛的根本原因!只需在gradle中添加以下行以添加依赖性:-编译'commons io:commons io:2.6',如果您的项目中已经有了Apache commons I/O,那就对了。但是,如果这就是你所需要的,那么你正在为你的项目添加(至少)2.5 MB的静重,这可以用一行代码轻松完成。为什么有人反对我的答案?请注意,这只返回基本名称,因此路径也被删除:这将把“a.jpg.jpg”转换为“a”,而不是(正确的)“a.jpg”。检查file.length()>0
的目的是什么?主要问题是“如何删除扩展名?”,因此,是的,它将“a.txt.zip”转换为“a”并将“.htaccess”转换为空。此函数用于字符串,因此文件名不能为null,但长度仍然可以为0,在解析符号之前更快地检查是否值得。当做
/**
*
* @param fileName
* @return file extension
* example file.fastq.gz => fastq.gz
*/
private String extractFileExtension(String fileName) {
String type = "undefined";
if (FilenameUtils.indexOfExtension(fileName) != -1) {
String fileBaseName = FilenameUtils.getBaseName(fileName);
int indexOfExtension = -1;
while (fileBaseName.contains(".")) {
indexOfExtension = FilenameUtils.indexOfExtension(fileBaseName);
fileBaseName = FilenameUtils.getBaseName(fileBaseName);
}
type = fileName.substring(indexOfExtension + 1, fileName.length());
}
return type;
}
public String getWithoutExtension(String fileFullPath){
return fileFullPath.substring(0, fileFullPath.lastIndexOf('.'));
}
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();
}
public static String removeExtension(String file) {
if(file != null && file.length() > 0) {
while(file.contains(".")) {
file = file.substring(0, file.lastIndexOf('.'));
}
}
return file;
}
org.springframework.util.StringUtils.stripFilenameExtension(String path)
Path removeExtension(Path path) {
return path.resolveSibling(path.getFileName().toString().replaceFirst("\\.[^.]*$", ""));
}