Я хотел получить подстроку

В настоящее время я использую такой код

    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();
    }
}
Другие вопросы по тегам