Quel est le moyen le plus efficace de couper le suffixe en Java, comme ceci:
title part1.txt
title part2.html
=>
title part1
title part2
C'est le genre de code que nous ne devrions pas faire nous-mêmes. Utilisez des bibliothèques pour les choses banales, sauvegardez votre cerveau pour les choses difficiles.
Dans ce cas, je recommande d'utiliser FilenameUtils.removeExtension () from Apache Commons IO
str.substring(0, str.lastIndexOf('.'))
Comme il est bon d'utiliser String.substring
et String.lastIndex
dans une ligne, il existe certains problèmes pour ce qui est de pouvoir gérer certains chemins de fichiers.
Prenons par exemple le chemin suivant:
a.b/c
L'utilisation du one-liner entraînera:
a
C'est faux.
Le résultat aurait dû être c
, mais comme le fichier n'avait pas d'extension, mais que le chemin contenait un répertoire avec .
dans le nom, la méthode one-liner a été amenée à donner une partie du chemin comme nom de fichier, ce qui n'est pas correct.
Besoin de chèques
Inspiré par la réponse de skaffman , j’ai jeté un coup d’œil à la méthode FilenameUtils.removeExtension
de la Apache Commons IO .
Afin de recréer son comportement, j'ai écrit quelques tests que la nouvelle méthode doit remplir, qui sont les suivants:
Chemin Nom du fichier -------------- -------- A/b/c c A/b/c.jpg c a/b/c.jpg.jpg c.jpg ab/c c ab/c.jpg c ab/c.jpg.jpg c.jpg c c c.jpg c c.jpg.jpg c.jpg
(Et c'est tout ce que j'ai vérifié - il y a probablement d'autres vérifications qui devraient être en place et que j'ai oubliées.)
La mise en oeuvre
Voici mon implémentation pour la méthode 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);
}
L'exécution de cette méthode removeExtension
avec les tests ci-dessus donne les résultats énumérés ci-dessus.
La méthode a été testée avec le code suivant. Comme cela a été exécuté sous Windows, le séparateur de chemin est un \
qui doit être échappé avec un \
lorsqu'il est utilisé dans le cadre d'un littéral 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"));
Les résultats ont été:
c
c
c.jpg
c
c
c.jpg
c
c
c.jpg
Les résultats correspondent aux résultats souhaités décrits dans le test que la méthode doit effectuer.
BTW, dans mon cas, lorsque je voulais une solution rapide pour supprimer une extension spécifique, c’est à peu près ce que j’ai fait:
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);
}
Est-ce une question piège? : p
Je ne peux pas penser à un moyen plus rapide atm.
filename.substring(filename.lastIndexOf('.'), filename.length()).toLowerCase();
J'ai trouvé la réponse de coolbird particulièrement utile.
Mais j'ai changé les derniers résultats en:
if (extensionIndex == -1)
return s;
return s.substring(0, lastSeparatorIndex+1)
+ filename.substring(0, extensionIndex);
car je voulais que le nom du chemin complet soit retourné.
Donc "C:\Utilisateurs\mroh004.COM\Documents\Test\Test.xml" devient "C:\Utilisateurs\mroh004.COM\Documents\Test\Test" et non "Tester"
Utilisez une méthode dans la classe com.google.common.io.Files
si votre projet dépend déjà de la bibliothèque principale de Google. La méthode dont vous avez besoin est getNameWithoutExtension
.
Utilisez une regex. Celui-ci remplace le dernier point et tout ce qui suit.
String baseName = fileName.replaceAll("\\.[^.]*$", "");
Vous pouvez également créer un objet Pattern si vous souhaitez précompiler la regex.
String[] splitted = fileName.split(".");
String fileNameWithoutExtension = fileName.replace("." + splitted[splitted.length - 1], "");
créer un nouveau fichier avec un chemin d'image de chaîne
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 donne la réponse suivante
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] );
}
vous pouvez essayer cette fonction, très basique
public String getWithoutExtension(String fileFullPath){
return fileFullPath.substring(0, fileFullPath.lastIndexOf('.'));
}
Garder à l'esprit les scénarios où il n'y a pas d'extension de fichier ou s'il y a plus d'une extension de fichier
exemple Nom de fichier: fichier | fichier.txt | fichier.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();
}
Cela affichera exemple pour les deux img et imgLink
public static String removeExtension(String file) {
if(file != null && file.length() > 0) {
while(file.contains(".")) {
file = file.substring(0, file.lastIndexOf('.'));
}
}
return file;
}
Je ferais comme ça:
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);
Commençant à la fin jusqu'au '.' puis appelez la sous-chaîne.
Edit: Peut-être pas un golf mais c'est efficace :)