Apa cara paling efisien untuk memangkas suffix di Jawa, seperti ini:
title part1.txt
title part2.html
=>
title part1
title part2
Apa cara paling efisien untuk memangkas suffix di Jawa, seperti ini:
title part1.txt
title part2.html
=>
title part1
title part2
Jawaban:
Ini adalah semacam kode yang tidak seharusnya kita lakukan sendiri. Gunakan perpustakaan untuk hal-hal duniawi, selamatkan otakmu untuk hal-hal yang sulit.
Dalam hal ini, saya sarankan menggunakan FilenameUtils.removeExtension () dari Apache Commons IO
str.substring(0, str.lastIndexOf('.'))
if(str.contains(".")) str.substring(0, str.lastIndexOf('.'))
Karena menggunakan String.substringdan String.lastIndexdalam satu-liner itu baik, ada beberapa masalah dalam hal dapat mengatasi jalur file tertentu.
Ambil contoh jalur berikut:
a.b/c
Menggunakan one-liner akan menghasilkan:
a
Itu tidak benar.
Hasilnya seharusnya c, tetapi karena file tidak memiliki ekstensi, tetapi path memiliki direktori dengan .nama, metode one-liner diperdaya untuk memberikan bagian dari path sebagai nama file, yang tidak benar.
Perlu cek
Terinspirasi oleh jawaban skaffman , saya melihat FilenameUtils.removeExtensionmetode Apache Commons IO .
Untuk menciptakan kembali perilakunya, saya menulis beberapa tes yang harus dipenuhi oleh metode baru, yaitu:
Path Nama file -------------- -------- 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
(Dan hanya itu yang sudah saya periksa - mungkin ada cek lain yang seharusnya ada di tempat yang saya abaikan.)
Pelaksanaan
Berikut ini adalah implementasi saya untuk removeExtensionmetode ini:
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);
}
Menjalankan removeExtensionmetode ini dengan tes di atas menghasilkan hasil yang tercantum di atas.
Metode ini diuji dengan kode berikut. Karena ini dijalankan pada Windows, pemisah jalur adalah \yang harus diloloskan dengan \ketika digunakan sebagai bagian dari suatu Stringliteral.
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"));
Hasilnya adalah:
c
c
c.jpg
c
c
c.jpg
c
c
c.jpg
Hasilnya adalah hasil yang diinginkan yang diuraikan dalam tes yang harus dipenuhi metode ini.
System.getProperty("file.separator")dan bukan hanya File.separator?
/path/to/.htaccess
BTW, dalam kasus saya, ketika saya menginginkan solusi cepat untuk menghapus ekstensi tertentu, ini kira-kira yang saya lakukan:
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('.'));
Gunakan metode di com.google.common.io.Fileskelas jika proyek Anda sudah bergantung pada pustaka inti Google. Metode yang Anda butuhkan adalah getNameWithoutExtension.
Saya menemukan jawaban coolbird sangat berguna.
Tapi saya mengubah pernyataan hasil terakhir menjadi:
if (extensionIndex == -1)
return s;
return s.substring(0, lastSeparatorIndex+1)
+ filename.substring(0, extensionIndex);
karena saya ingin nama path lengkap dikembalikan.
Jadi "C: \ Users \ mroh004.COM \ Documents \ Test \ Test.xml" menjadi "C: \ Users \ mroh004.COM \ Documents \ Test \ Test" dan tidak "Uji"
Gunakan regex. Yang ini menggantikan titik terakhir, dan semuanya setelahnya.
String baseName = fileName.replaceAll("\\.[^.]*$", "");
Anda juga dapat membuat objek Pola jika Anda ingin mengkompilasi regex.
buat file baru dengan jalur gambar string
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 versi 2.4 memberikan jawaban berikut
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 = '\\';
Saya akan melakukan ini:
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);
Mulai dari akhir hingga '.' lalu panggil substring.
Sunting: Mungkin bukan golf tapi ini efektif :)
Ingat skenario di mana tidak ada ekstensi file atau ada lebih dari satu ekstensi file
contoh Nama file: 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;
}
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();
}
Ini akan menampilkan contoh untuk img dan 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() > 0cek?