Регулярное выражение расширения файла Java

Я пытаюсь придумать регулярное выражение Java, которое будет соответствовать имени файла, только если оно имеет допустимое расширение. Например, он должен соответствовать «foo.bar» и «foo.b», но не «foo». ни "фу".

Я написал следующую тестовую программу

public static void main(String[] args) {
  Pattern fileExtensionPattern = Pattern.compile("\\.\\w+\\z");

  boolean one = fileExtensionPattern.matcher("foo.bar").matches();
  boolean two = fileExtensionPattern.matcher("foo.b").matches();
  boolean three = fileExtensionPattern.matcher("foo.").matches();
  boolean four = fileExtensionPattern.matcher("foo").matches();

  System.out.println(one + " " + two + " " + three + " " + four);
}

Я ожидаю, что это напечатает «true true false false», но вместо этого он печатает false для всех 4 случаев. Где я ошибаюсь?

Ваше здоровье, Дон

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
4
0
11 849
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Функция Matcher.matches () пытается сопоставить шаблон со всем вводом. Таким образом, вам нужно добавить .* в начало вашего регулярного выражения (и \\Z в конце тоже лишний) или использовать метод найти().

Кроме того, Дон мог бы подумать о том, чтобы обернуть свое регулярное выражение в FileFilter: java.sun.com/j2se/1.4.2/docs/api/java/io/FileFilter.html

Chris Dolan 25.10.2008 08:10
public boolean isFilename(String filename) {
    int i=filename.lastInstanceOf(".");
    return(i != -1 && i != filename.length - 1)
}

Будет значительно быстрее, и независимо от того, что вы делаете, добавление его в метод будет более читабельным.

package regularexpression;

import java.io.File;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegularFile {
    public static void main(String[] args) {
        new RegularFile();
    }

    public RegularFile() {

        String fileName = null;
        boolean bName = false;
        int iCount = 0;
        File dir = new File("C:/regularfolder");
        File[] files = dir.listFiles();
        System.out.println("List Of Files ::");

        for (File f : files) {

            fileName = f.getName();
            System.out.println(fileName);

            Pattern uName = Pattern.compile(".*l.zip.*");
            Matcher mUname = uName.matcher(fileName);
            bName = mUname.matches();
            if (bName) {
                iCount++;

            }
        }
        System.out.println("File Count In Folder ::" + iCount);

    }
}

Спасибо за ответ! Хотя фрагмент кода может ответить на этот вопрос, все же здорово добавить дополнительную информацию, например, объяснить и т. д.

j0k 04.10.2012 13:22

Другие вопросы по теме