Cách hiệu quả nhất để cắt hậu tố trong Java, như thế này:
title part1.txt
title part2.html
=>
title part1
title part2
Cách hiệu quả nhất để cắt hậu tố trong Java, như thế này:
title part1.txt
title part2.html
=>
title part1
title part2
Câu trả lời:
Đây là loại mã mà chúng ta không nên tự làm. Sử dụng các thư viện cho những thứ trần tục, tiết kiệm bộ não của bạn cho những thứ cứng.
Trong trường hợp này, tôi khuyên bạn nên sử dụng FilenameUtils.removeExtension () từ Apache Commons IO
str.substring(0, str.lastIndexOf('.'))
if(str.contains("."))
str.substring(0, str.lastIndexOf('.'))
Vì việc sử dụng String.substring
và String.lastIndex
trong một lớp lót là tốt, có một số vấn đề về khả năng đối phó với các đường dẫn tệp nhất định.
Lấy ví dụ đường dẫn sau:
a.b/c
Sử dụng một lớp lót sẽ dẫn đến:
a
Điều đó không chính xác.
Kết quả đáng lẽ phải có c
, nhưng vì tệp thiếu phần mở rộng, nhưng đường dẫn có một thư mục có .
tên, phương thức one-liner bị lừa đưa ra một phần của đường dẫn là tên tệp, không đúng.
Cần kiểm tra
Lấy cảm hứng từ câu trả lời của skaffman , tôi đã xem FilenameUtils.removeExtension
phương pháp của Apache Commons IO .
Để tạo lại hành vi của nó, tôi đã viết một vài thử nghiệm mà phương thức mới cần thực hiện, đó là:
Tên tệp đường dẫn -------------- -------- a / b / cc a / b / c.jpg c a / b / c.jpg.jpg ab / cc ab / c.jpg c ab / c.jpg.jpg c.jpg cc c.jpg c c.jpg.jpg
(Và đó là tất cả những gì tôi đã kiểm tra - có thể có những kiểm tra khác nên được đặt tại chỗ mà tôi đã bỏ qua.)
Việc thực hiện
Sau đây là triển khai của tôi cho removeExtension
phương pháp:
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);
}
Chạy removeExtension
phương pháp này với các thử nghiệm trên mang lại kết quả được liệt kê ở trên.
Phương pháp đã được thử nghiệm với mã sau đây. Vì điều này đã được chạy trên Windows, trình phân tách đường dẫn là một lối \
thoát phải được thoát với \
khi được sử dụng như một phần của String
nghĩa đen.
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"));
Kết quả là:
c
c
c.jpg
c
c
c.jpg
c
c
c.jpg
Kết quả là kết quả mong muốn được nêu trong thử nghiệm mà phương pháp cần thực hiện.
System.getProperty("file.separator")
và không chỉ File.separator
?
/path/to/.htaccess
BTW, trong trường hợp của tôi, khi tôi muốn một giải pháp nhanh chóng để loại bỏ một phần mở rộng cụ thể, đây là khoảng những gì tôi đã làm:
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('.'));
Sử dụng một phương thức trong com.google.common.io.Files
lớp nếu dự án của bạn đã phụ thuộc vào thư viện lõi của Google. Phương pháp bạn cần là getNameWithoutExtension
.
Tôi thấy câu trả lời của coolbird đặc biệt hữu ích.
Nhưng tôi đã thay đổi báo cáo kết quả cuối cùng thành:
if (extensionIndex == -1)
return s;
return s.substring(0, lastSeparatorIndex+1)
+ filename.substring(0, extensionIndex);
như tôi muốn tên đường dẫn đầy đủ được trả về.
Vì vậy, "C: \ Users \ mroh004.COM \ Documents \ Test \ Test.xml" trở thành "C: \ Users \ mroh004.COM \ Documents \ Test \ Test" và không "Kiểm tra"
Sử dụng một regex. Cái này thay thế dấu chấm cuối cùng, và mọi thứ sau nó.
String baseName = fileName.replaceAll("\\.[^.]*$", "");
Bạn cũng có thể tạo một đối tượng Mẫu nếu bạn muốn biên dịch trước biểu thức chính quy.
tạo một tệp mới với đường dẫn hình ảnh chuỗi
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 phiên bản 2.4 cho câu trả lời sau
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] );
}
Tôi sẽ làm như thế này:
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);
Bắt đầu từ cuối cho đến khi '.' sau đó gọi chuỗi con.
Chỉnh sửa: Có thể không phải là một golf nhưng nó hiệu quả :)
Hãy ghi nhớ các tình huống không có phần mở rộng tệp hoặc có nhiều phần mở rộng tệp
ví dụ Tên tệp: tệp | 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();
}
Điều này sẽ xuất ví dụ cho cả img và 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
kiểm tra?