Was ist der effizienteste Weg, um das Suffix in Java wie folgt zu kürzen:
title part1.txt
title part2.html
=>
title part1
title part2
Was ist der effizienteste Weg, um das Suffix in Java wie folgt zu kürzen:
title part1.txt
title part2.html
=>
title part1
title part2
Antworten:
Dies ist die Art von Code, die wir nicht selbst machen sollten. Verwenden Sie Bibliotheken für das Alltägliche, retten Sie Ihr Gehirn für das Harte.
In diesem Fall empfehle ich die Verwendung von FilenameUtils.removeExtension () von Apache Commons IO
str.substring(0, str.lastIndexOf('.'))
if(str.contains("."))
str.substring(0, str.lastIndexOf('.'))
Da die Verwendung von String.substring
und String.lastIndex
in einem Einzeiler gut ist, gibt es einige Probleme hinsichtlich der Fähigkeit, mit bestimmten Dateipfaden umzugehen.
Nehmen Sie zum Beispiel den folgenden Weg:
a.b/c
Die Verwendung des Einzeilers führt zu:
a
Das ist falsch
Das Ergebnis hätte sein sollen c
, aber da der Datei eine Erweiterung fehlte, der Pfad jedoch ein Verzeichnis mit einem .
im Namen hatte, wurde die Einzeiler-Methode dazu verleitet, einen Teil des Pfads als Dateinamen anzugeben, was nicht korrekt ist.
Notwendigkeit von Schecks
Inspiriert von Skaffmans Antwort , habe ich mir die FilenameUtils.removeExtension
Methode des Apache Commons IO angesehen .
Um sein Verhalten wiederherzustellen, habe ich einige Tests geschrieben, die die neue Methode erfüllen sollte:
Pfad Dateiname -------------- -------- 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
(Und das ist alles, worauf ich überprüft habe - es gibt wahrscheinlich andere Überprüfungen, die vorhanden sein sollten, die ich übersehen habe.)
Die Umsetzung
Das Folgende ist meine Implementierung für die removeExtension
Methode:
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);
}
Wenn Sie diese removeExtension
Methode mit den oben genannten Tests ausführen, erhalten Sie die oben aufgeführten Ergebnisse.
Die Methode wurde mit dem folgenden Code getestet. Da dies unter Windows ausgeführt wurde, ist das Pfadtrennzeichen ein, \
das \
bei Verwendung als Teil eines String
Literal mit einem Escapezeichen versehen werden muss.
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"));
Die Ergebnisse waren:
c
c
c.jpg
c
c
c.jpg
c
c
c.jpg
Die Ergebnisse sind die gewünschten Ergebnisse, die in dem Test aufgeführt sind, den die Methode erfüllen sollte.
System.getProperty("file.separator")
und nicht nur File.separator
?
/path/to/.htaccess
Übrigens, in meinem Fall, als ich eine schnelle Lösung zum Entfernen einer bestimmten Erweiterung wollte, habe ich ungefähr Folgendes getan:
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('.'));
Verwenden Sie eine Methode im com.google.common.io.Files
Unterricht, wenn Ihr Projekt bereits von der Google-Kernbibliothek abhängig ist. Die Methode, die Sie benötigen, ist getNameWithoutExtension
.
Ich habe die Antwort von coolbird gefunden besonders nützlich.
Aber ich habe die letzten Ergebnisaussagen geändert in:
if (extensionIndex == -1)
return s;
return s.substring(0, lastSeparatorIndex+1)
+ filename.substring(0, extensionIndex);
da ich wollte, dass der vollständige Pfadname zurückgegeben wird.
So wird "C: \ Users \ mroh004.COM \ Documents \ Test \ Test.xml" "C: \ Users \ mroh004.COM \ Documents \ Test \ Test" und nicht "Prüfung"
Verwenden Sie einen regulären Ausdruck. Dieser ersetzt den letzten Punkt und alles danach.
String baseName = fileName.replaceAll("\\.[^.]*$", "");
Sie können auch ein Musterobjekt erstellen, wenn Sie den regulären Ausdruck vorkompilieren möchten.
Erstellen Sie eine neue Datei mit dem Pfad des Zeichenfolgenbilds
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 Version 2.4 gibt die folgende Antwort
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 = '\\';
Das würde mir gefallen:
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);
Vom Ende bis zum '.' Rufen Sie dann Teilzeichenfolge auf.
Edit: Könnte kein Golf sein, aber es ist effektiv :)
Beachten Sie die Szenarien, in denen es keine Dateierweiterung oder mehr als eine Dateierweiterung gibt
Beispiel Dateiname: Datei | 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();
}
Dies gibt ein Beispiel für img und imgLink aus
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
Prüfung?