Qual è il modo più efficiente per tagliare il suffisso in Java, in questo modo:
title part1.txt
title part2.html
=>
title part1
title part2
Qual è il modo più efficiente per tagliare il suffisso in Java, in questo modo:
title part1.txt
title part2.html
=>
title part1
title part2
Risposte:
Questo è il tipo di codice che non dovremmo fare da soli. Usa le librerie per le cose banali, salva il tuo cervello per le cose difficili.
In questo caso, ti consiglio di usare FilenameUtils.removeExtension () da Apache Commons IO
str.substring(0, str.lastIndexOf('.'))
if(str.contains("."))
str.substring(0, str.lastIndexOf('.'))
Come usando il String.substring
eString.lastIndex
in una riga è buono, ci sono alcuni problemi in termini di capacità di far fronte a determinati percorsi di file.
Prendi ad esempio il seguente percorso:
a.b/c
L'uso del one-liner comporterà:
a
Non è corretto
Il risultato avrebbe dovuto essere c
, ma poiché il file mancava di un'estensione, ma il percorso aveva una directory con un .
nel nome, il metodo one-liner è stato ingannato nel dare parte del percorso come nome del file, che non è corretto.
Necessità di controlli
Ispirato dalla risposta di Skaffman , ho dato un'occhiata al FilenameUtils.removeExtension
metodo di IO di Apache Commons .
Per ricreare il suo comportamento, ho scritto alcuni test che il nuovo metodo dovrebbe soddisfare, che sono i seguenti:
Nome file percorso -------------- -------- 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
(E questo è tutto quello che ho controllato - probabilmente ci sono altri controlli che dovrebbero essere in atto che ho trascurato.)
L'implemento
Di seguito è la mia implementazione per il removeExtension
metodo:
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);
}
L'esecuzione di questo removeExtension
metodo con i test sopra riportati produce i risultati sopra elencati.
Il metodo è stato testato con il seguente codice. Dato che è stato eseguito su Windows, il separatore di percorso è un carattere \
che deve essere evitato con un \
quando usato come parte di un valore String
letterale.
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"));
I risultati furono:
c
c
c.jpg
c
c
c.jpg
c
c
c.jpg
I risultati sono i risultati desiderati delineati nel test che il metodo dovrebbe soddisfare.
System.getProperty("file.separator")
e non solo File.separator
?
/path/to/.htaccess
A proposito, nel mio caso, quando volevo una soluzione rapida per rimuovere un'estensione specifica, questo è approssimativamente quello che ho fatto:
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('.'));
Utilizza un metodo in com.google.common.io.Files
classe se il tuo progetto dipende già dalla libreria principale di Google. Il metodo che ti serve è getNameWithoutExtension
.
Ho trovato la risposta di coolbird particolarmente utile.
Ma ho cambiato le ultime dichiarazioni dei risultati in:
if (extensionIndex == -1)
return s;
return s.substring(0, lastSeparatorIndex+1)
+ filename.substring(0, extensionIndex);
come volevo che fosse restituito il nome completo del percorso.
Così diventa "C: \ Users \ mroh004.COM \ Documents \ Test \ Test.xml" "C: \ Users \ mroh004.COM \ Documents \ Test \ Test" e non "Test"
filename.substring(filename.lastIndexOf('.'), filename.length()).toLowerCase();
Usa una regex. Questo sostituisce l'ultimo punto e tutto il resto.
String baseName = fileName.replaceAll("\\.[^.]*$", "");
Puoi anche creare un oggetto Pattern se vuoi precompilare la regex.
creare un nuovo file con percorso immagine stringa
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 versione 2.4 fornisce la seguente risposta
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 = '\\';
Vorrei fare questo:
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);
Cominciando fino alla fine fino al '.' quindi chiamare sottostringa.
Modifica: potrebbe non essere un golf ma è efficace :)
Tenendo presente gli scenari in cui non esiste un'estensione di file o esiste più di un'estensione di file
esempio Nome 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();
}
Questo mostrerà un esempio sia per img che per 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
controllo?