Який найефективніший спосіб обрізати суфікс на Java, наприклад:
title part1.txt
title part2.html
=>
title part1
title part2
Який найефективніший спосіб обрізати суфікс на Java, наприклад:
title part1.txt
title part2.html
=>
title part1
title part2
Відповіді:
Це такий код, який ми не повинні робити самі. Використовуйте бібліотеки для мирських речей, збережіть свій мозок для важких речей.
У цьому випадку я рекомендую використовувати FilenameUtils.removeExtension () від AOche Commons IO
str.substring(0, str.lastIndexOf('.'))
if(str.contains("."))
str.substring(0, str.lastIndexOf('.'))
Оскільки використання String.substring
та String.lastIndex
в одному вкладиші добре, є деякі проблеми з точки зору спроможності впоратися з певними шляхами файлів.
Візьмемо для прикладу наступний шлях:
a.b/c
Використання одного вкладиша призведе до:
a
Це неправильно.
Результат повинен був бути c
, але оскільки у файлі бракувало розширення, але шлях мав довідник з .
ім'ям, метод однолінійки вводив набір частини шляху як імені файлу, що невірно.
Необхідність перевірок
Надихнувшись відповіддю скафмана , я переглянув FilenameUtils.removeExtension
метод IO Apache Commons .
Щоб відтворити її поведінку, я написав кілька тестів, які повинен виконати новий метод, які є наступними:
Ім'я файлу шляху -------------- -------- a / b / cc a / b / c.jpg c a / b / c.jpg.jpg c.jpg аб / куб 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('.'));
Використовуйте метод у com.google.common.io.Files
класі, якщо ваш проект вже залежить від основної бібліотеки Google. Вам потрібен метод getNameWithoutExtension
.
Відповідь 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: \ Користувачі \ mroh004.COM \ Документи \ Тест \ Тест", а ні "Тест"
Використовуйте регулярний вираз. Цей замінює останню крапку і все після неї.
String baseName = fileName.replaceAll("\\.[^.]*$", "");
Ви також можете створити об'єкт "Шаблон", якщо ви хочете попередньо компілювати регулярний вираз.
створити новий файл із рядком шляху зображення
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 = '\\';
Я б так зробив:
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
чек?