Answers:
这是我们不应该自己编写的代码。使用库来处理平凡的事物,而将您的大脑用于硬性事物。
在这种情况下,我建议使用FilenameUtils.removeExtension()从Apache的百科全书IO
str.substring(0, str.lastIndexOf('.'))
if(str.contains("."))
str.substring(0, str.lastIndexOf('.'))
由于使用String.substring
和String.lastIndex
在单行中很好,因此在能够处理某些文件路径方面存在一些问题。
以以下路径为例:
a.b/c
使用单线将导致:
a
那是不对的。
结果应该是c
,但是由于文件没有扩展名,但是路径中有一个.
名称为的目录,因此,单线方法被欺骗为路径的一部分提供文件名,这是不正确的。
需要检查
受skaffman答案的启发,我看了Apache Commons IO的FilenameUtils.removeExtension
方法。
为了重新创建其行为,我编写了新方法应满足的一些测试,这些测试如下:
路径文件名 -------------- -------- a / b / cc a / b / c.jpg c a / b / c.jpg.jpg c.jpg 绝对/ cc ab / c.jpg c ab / c.jpg.jpg c.jpg 抄送 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
文字的一部分时,必须使用a对其进行转义。
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
结果是该方法应满足的测试中概述的期望结果。
System.getProperty("file.separator")
而不是仅仅有特定的原因File.separator
吗?
/path/to/.htaccess
String foo = "title part1.txt";
foo = foo.substring(0, foo.lastIndexOf('.'));
com.google.common.io.Files
如果您的项目已经依赖于Google核心库,请使用类中的方法。您需要的方法是getNameWithoutExtension
。
我发现coolbird的答案特别有用。
但是我将最后一个结果语句更改为:
if (extensionIndex == -1)
return s;
return s.substring(0, lastSeparatorIndex+1)
+ filename.substring(0, extensionIndex);
因为我希望返回完整的路径名。
因此,“ C:\ Users \ mroh004.COM \ Documents \ Test \ Test.xml”变为 “ C:\ Users \ mroh004.COM \ Documents \ Test \ Test”而不是 “测试”
使用正则表达式。这个替换最后一个点,以及后面的所有内容。
String baseName = fileName.replaceAll("\\.[^.]*$", "");
如果要预编译正则表达式,也可以创建Pattern对象。
用字符串图像路径创建一个新文件
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 = '\\';
请记住没有文件扩展名或存在多个文件扩展名的情况
示例文件名: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;
}
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
public static String removeExtension(String file) {
if(file != null && file.length() > 0) {
while(file.contains(".")) {
file = file.substring(0, file.lastIndexOf('.'));
}
}
return file;
}
file.length() > 0
支票有什么目的?