วิธีที่มีประสิทธิภาพมากที่สุดในการตัดส่วนต่อท้ายใน Java เป็นเช่นนี้:
title part1.txt
title part2.html
=>
title part1
title part2
วิธีที่มีประสิทธิภาพมากที่สุดในการตัดส่วนต่อท้ายใน Java เป็นเช่นนี้:
title part1.txt
title part2.html
=>
title part1
title part2
คำตอบ:
นี่คือรหัสที่เราไม่ควรทำเอง ใช้ห้องสมุดสำหรับสิ่งต่าง ๆ บันทึกสมองของคุณสำหรับสิ่งที่ยาก
ในกรณีนี้ฉันแนะนำให้ใช้FilenameUtils.removeExtension ()จากApache Commons IO
str.substring(0, str.lastIndexOf('.'))
if(str.contains("."))
str.substring(0, str.lastIndexOf('.'))
เนื่องจากการใช้String.substring
และString.lastIndex
ในหนึ่งซับเป็นสิ่งที่ดีมีปัญหาบางประการในแง่ของความสามารถในการรับมือกับเส้นทางไฟล์บางอย่าง
ใช้ตัวอย่างเส้นทางต่อไปนี้:
a.b/c
การใช้หนึ่งซับจะทำให้:
a
นั่นไม่ถูกต้อง
ผลลัพธ์ควรได้รับc
แต่เนื่องจากไฟล์ขาดส่วนขยาย แต่เส้นทางมีไดเรกทอรีที่มี.
ชื่อในวิธีหนึ่งซับถูกหลอกให้เป็นส่วนหนึ่งของเส้นทางเป็นชื่อไฟล์ซึ่งไม่ถูกต้อง
ต้องการตรวจสอบ
แรงบันดาลใจจากคำตอบ skaffman ของผมเอาดูที่FilenameUtils.removeExtension
วิธีการของApache Commons IO
เพื่อสร้างพฤติกรรมของมันขึ้นมาใหม่ฉันได้เขียนการทดสอบสองสามครั้งเกี่ยวกับวิธีการใหม่ที่ควรทำซึ่งมีดังต่อไปนี้:
ชื่อไฟล์พา ธ -------------- -------- A / B / ซีซี a / b / c.jpg c a / b / c.jpg.jpg c.jpg AB / ซีซี 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
ตัวอักษร
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
BTW ในกรณีของฉันเมื่อฉันต้องการวิธีแก้ปัญหาอย่างรวดเร็วเพื่อลบส่วนขยายเฉพาะนี่คือสิ่งที่ฉันทำ:
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('.'));
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
ฉันไม่สามารถคิดวิธีที่เร็วกว่า atm
ใช้วิธีการในcom.google.common.io.Files
ชั้นเรียนหากโครงการของคุณขึ้นอยู่กับห้องสมุดหลักของ Google แล้ว getNameWithoutExtension
วิธีการที่คุณต้องมี
คุณสามารถลองใช้ฟังก์ชันนี้พื้นฐานได้
public String getWithoutExtension(String fileFullPath){
return fileFullPath.substring(0, fileFullPath.lastIndexOf('.'));
}
ฉันพบว่าคำตอบของ 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" และไม่ใช่ "ทดสอบ"
filename.substring(filename.lastIndexOf('.'), filename.length()).toLowerCase();
ใช้ regex อันนี้แทนที่จุดสุดท้ายและทุกอย่างที่อยู่หลังมัน
String baseName = fileName.replaceAll("\\.[^.]*$", "");
คุณยังสามารถสร้างวัตถุรูปแบบได้หากคุณต้องการคอมไพล์ regex ล่วงหน้า
String[] splitted = fileName.split(".");
String fileNameWithoutExtension = fileName.replace("." + splitted[splitted.length - 1], "");
"\\."
เป็น "." เป็นพิเศษสำหรับ regex
สร้างไฟล์ใหม่ด้วยเส้นทางภาพสตริง
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 = '\\';
private String trimFileExtension(String fileName)
{
String[] splits = fileName.split( "\\." );
return StringUtils.remove( fileName, "." + splits[splits.length - 1] );
}
ฉันจะทำสิ่งนี้:
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);
เริ่มต้นจนจบจนถึง '.' จากนั้นเรียกสตริงย่อย
แก้ไข: อาจไม่ใช่กอล์ฟ แต่มีผล :)
โปรดคำนึงถึงสถานการณ์ที่ไม่มีนามสกุลไฟล์หรือมีนามสกุลไฟล์มากกว่าหนึ่ง
ตัวอย่างชื่อไฟล์: ไฟล์ | 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
เช็ค?