Я хотел получить подстроку
В настоящее время я использую такой код
while (fileName.endsWith(".csv")) {
fileName = fileName.substring(0, fileName.lastIndexOf(FILE_SUFFIX_CSV));
if (fileName.trim().isEmpty()) {
throw new IllegalArgumentException();
}
}
Приведенный выше код отлично работает, когда пользователь указывает расширение маленькими буквами (.csv), но Windows принимает расширения с учетом регистра, поэтому он может выдавать как.CsV,.CSV и т. Д. Как я могу изменить приведенный выше код?
Заранее спасибо
5 ответов
Почему бы вам не включить его в нижний регистр?
while (fileName.toLowerCase().endsWith(".csv")) {
fileName = fileName.substring(0, fileName.toLowerCase().lastIndexOf(FILE_SUFFIX_CSV));
if (fileName.trim().isEmpty()) {
throw new IllegalArgumentException();
}
}
Решение для регулярных выражений поздней ночью:
Pattern pattern = Pattern.compile(".csv", Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(fileName);
while (matcher.find()) {
fileName = fileName.substring(0, matcher.start());
if (fileName.trim().isEmpty()) {
throw new IllegalArgumentException();
}
}
Matcher
будет только find()
один раз. Затем он может сообщить о своем start
положение, которое вы можете использовать для substring
оригинальное имя файла.
Пожалуйста, переведите в нижний регистр, а затем сравните.
while (fileName.toLowerCase().endsWith(".csv")) {
fileName = fileName.toLowerCase().substring(0, fileName.toLowerCase().lastIndexOf(FILE_SUFFIX_CSV));
if (fileName.toLowerCase().trim().isEmpty()) {
throw new IllegalArgumentException();
}
}
Вы можете попробовать этот способ
int lastIndexOfDot=fileName.lastIndexOf("\\.");
String fileExtension=fileName.substring(lastIndexOfDot+1,fileName.length());
while(fileExtension.equalsIgnoreCase(".csv")){
}
Или же
while(fileName.toUpperCase().endsWith(".CSV"){}
Вы можете преобразовать оба в верхний регистр.
Так что измени эту строку
fileName = fileName.substring(0, fileName.lastIndexOf(FILE_SUFFIX_CSV));
в
fileName = fileName.toUpperCase().substring(0, fileName.lastIndexOf(FILE_SUFFIX_CSV.toUpperCase()));
Используйте эту служебную функцию:
public static boolean endsWithIgnoreCase(String str, String suffix)
{
int suffixLength = suffix.length();
return str.regionMatches(true, str.length() - suffixLength, suffix, 0, suffixLength);
}
теперь вы можете:
while (endsWithIgnoreCase(fileName, ".csv")) {
fileName = fileName.substring(0, fileName.toLowerCase().lastIndexOf(FILE_SUFFIX_CSV));
if (fileName.trim().isEmpty()) {
throw new IllegalArgumentException();
}
}