Java'da soneki kırpmanın en etkili yolu nedir, şöyle:
title part1.txt
title part2.html
=>
title part1
title part2
Java'da soneki kırpmanın en etkili yolu nedir, şöyle:
title part1.txt
title part2.html
=>
title part1
title part2
Yanıtlar:
Bu, kendimiz yapmamamız gereken bir kod türüdür. Sıradan şeyler için kütüphaneler kullanın, beyninizi zor şeyler için saklayın.
Bu durumda, ben kullanmanızı öneririz FilenameUtils.removeExtension () den Apache Commons IO
str.substring(0, str.lastIndexOf('.'))
if(str.contains("."))
str.substring(0, str.lastIndexOf('.'))
Kullanarak gibi String.substring
ve String.lastIndex
bir tek satırlık iyidir de, belirli dosya yolları ile baş edememek açısından bazı sorunlar vardır.
Örneğin aşağıdaki yolu ele alalım:
a.b/c
Tek astarın kullanılması aşağıdakilere neden olur:
a
Bu yanlış.
Sonuç olmalıydı c
, ancak dosyada bir uzantı bulunmadığından, ancak yolun .
adında bir dizini bulunduğundan , tek satırlı yöntem, yolun bir parçası olarak doğru olmayan dosya adı olarak kandırıldı.
Kontrol ihtiyacı
Skaffman'ın cevabından esinlenerek Apache Commons IOFilenameUtils.removeExtension
yöntemine bir göz attım .
Davranışını yeniden yaratmak için, yeni yöntemin yerine getirmesi gereken birkaç test yazdım:
Yol Dosya Adı -------------- -------- 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
(Ve kontrol ettiğim tek şey bu - muhtemelen göz ardı ettiğim başka kontroller var.)
Hayata geçirme
Yöntem için benim uygulama aşağıdadır 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);
}
Bu removeExtension
yöntemin yukarıdaki testlerle çalıştırılması , yukarıda listelenen sonuçları verir.
Yöntem aşağıdaki kod ile test edilmiştir. Bu Windows üzerinde çalıştırıldığından, yol ayırıcı bir değişmezin parçası olarak kullanıldığında \
bir ile kaçması gerekir .\
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"));
Sonuçlar:
c
c
c.jpg
c
c
c.jpg
c
c
c.jpg
Sonuçlar, yöntemin yerine getirmesi gereken testte belirtilen istenen sonuçlardır.
System.getProperty("file.separator")
Sadece kullanmanın değil, kullanmanın özel bir nedeni var mı File.separator
?
/path/to/.htaccess
BTW, benim durumumda, belirli bir uzantıyı kaldırmak için hızlı bir çözüm istediğimde, bu yaklaşık olarak yaptığım şeydi:
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('.'));
com.google.common.io.Files
Projeniz zaten Google çekirdek kütüphanesine bağımlıysa, sınıfta bir yöntem kullanın . İhtiyacınız olan yöntem getNameWithoutExtension
.
Coolbird'ün cevabını özellikle yararlı buldum .
Ama son sonuç ifadelerini şöyle değiştirdim:
if (extensionIndex == -1)
return s;
return s.substring(0, lastSeparatorIndex+1)
+ filename.substring(0, extensionIndex);
tam yol adının döndürülmesini istedim.
Böylece "C: \ Users \ mroh004.COM \ Documents \ Test \ Test.xml" olur "C: \ Kullanıcılar \ mroh004.COM \ Belgeler \ Test \ Test" değil "Ölçek"
Normal ifade kullanın. Bu son noktanın ve ondan sonraki her şeyin yerini alır.
String baseName = fileName.replaceAll("\\.[^.]*$", "");
Normal ifadeyi önceden derlemek istiyorsanız bir Pattern nesnesi de oluşturabilirsiniz.
dize görüntü yolu ile yeni bir dosya oluştur
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 sürüm 2.4 aşağıdaki yanıtı verir
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 = '\\';
Bunu şöyle yaparım:
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);
Sonuna kadar '.' sonra alt dize çağırın.
Edit: Golf olamaz ama etkili :)
Dosya uzantısının olmadığı veya birden fazla dosya uzantısının bulunduğu senaryoları unutmayın
örnek Dosyaadı: dosya | dosya.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();
}
Çıktısı verir örneği hem img ve 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
?