Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Поддержка групповых операций


Автор: lazycat 31.1.2008, 08:38
Доброго времени суток всем!

Простите за чайный вопрос, но попал в тупик. Задача: есть имя файла с символами замещения (например,  file*.txt). Как получить список всех файлов, удовлетворяющих шаблону?
Конечно, можно было бы воспользоваться File.list() а потом сделать грамматический разбор, но наверное должен быть более простой способ?

Заранее благодарен всем откликнувшимся

Автор: Ulysses4j 31.1.2008, 09:32
Именно Fil.list()!  Только с правильным аргументом (FilenameFilter):

Код

        File curDir = new File(System.getProperty("user.dir")); // поищем в текущей директории для примера

        final Pattern myFilesPattern = Pattern.compile("file.*.txt");
        String[] myFiles = curDir.list(new FilenameFilter() {

            public boolean accept(File dir, String name) {
                return myFilesPattern.matcher(name).matches();
            }
        });

        // посмотрим, что дал поиск
        for (String myFile : myFiles) {
            System.out.println(myFile);
        }


Автор: LSD 31.1.2008, 11:41
Ulysses4j, у тебя неправильная регулярка.

Автор: Ulysses4j 31.1.2008, 12:23
Поясните, пожалуйста, в чем: эта регулярка вывела файлы "file1.txt fileFun.txt".

Добавлено через 4 минуты и 28 секунд
И не вывела "fileWoh"

Добавлено через 5 минут и 26 секунд
А более тонкую подводку человек уже должен сам делать, исходя из того, что ему нужно: в конце концов, вопрос заключался не в этом.

Автор: Kangaroo 31.1.2008, 12:31
Может надо было вторую точку сделать точкой, а не любым символом?
Код

final Pattern myFilesPattern = Pattern.compile("file.*\\.txt");

Автор: LSD 31.1.2008, 12:56
Цитата(Ulysses4j @  31.1.2008,  12:23 Найти цитируемый пост)
Поясните, пожалуйста, в чем: эта регулярка вывела файлы "file1.txt fileFun.txt".

Код

Pattern pattern = Pattern.compile("file.*.txt");
Matcher matcher = pattern.matcher("file1txt");
System.out.println("matches = " + matcher.matches());

и вообще чаще, проще обойтись startsWith()/endsWith() быстрее будет работать.

Автор: lazycat 31.1.2008, 15:38
Большое спасибо, Ulysses4j!

Правда, это несколько не то, что я ожидал. Я искал "нечто", чему бы передал шаблон, а оно мне в ответ Enumeration с именами файлов, соответствующих шаблону. В С подобное есть и я удивлялся, почему бы ему не быть в Java.
Решение, которое Вы прислали, хорошее, но при этом надо просматривать переданную строку, заменять в ней * на .*,  ? на . , потом предварять каждый "ненормальный" символ обратным слэшем, одним словом код разрастается.

Увы, наши желания часто расходятся с действительностью

Еще раз спасибо!

Автор: Kangaroo 31.1.2008, 16:03
Цитата(lazycat @  31.1.2008,  14:38 Найти цитируемый пост)
но при этом надо просматривать переданную строку, заменять в ней * на .*,  ? на . 

Какую строку? Зачем заменять?
Ulysses4j использовал шаблон, возвращаются файлы, которые соответствуют этому шаблону..

Автор: lazycat 31.1.2008, 16:43
Так пользователь же не знает языка регулярных выражений. Единственное, что для него доступно - это символы замещения ? и * в именах файлов. А сделать из того, что получу шаблон - это моя задача.

Автор: Kangaroo 31.1.2008, 16:53
Цитата(lazycat @  31.1.2008,  15:43 Найти цитируемый пост)
Так пользователь же не знает языка регулярных выражений. Единственное, что для него доступно - это символы замещения ? и * в именах файлов. А сделать из того, что получу шаблон - это моя задача.

хе, теперь понятно. 

Цитата(lazycat @  31.1.2008,  14:38 Найти цитируемый пост)
Я искал "нечто", чему бы передал шаблон, а оно мне в ответ Enumeration с именами файлов, соответствующих шаблону. В С подобное есть и я удивлялся, почему бы ему не быть в Java.

Ну тут уж мы не виноваты, что пользователь шаблоны для С знает, а для Java не выучил..  smile 

Автор: lazycat 31.1.2008, 17:12
Цитата

Ну тут уж мы не виноваты, что пользователь шаблоны для С знает, а для Java не выучил..


Странное утверждение.

Есть шаблоны для работы с файловой системой (по сути они включают только два символа: * и ?. Их знает и применяет пользователь.
Есть шаблоны регулярных выражений, те, которые используем мы.
В C есть функции, которые позволяют получить набор файлов, соответствующих тому шаблону, который ЗАДАЛ ПОЛЬЗОВАТЕЛЬ. При этом нет необходимости использовать регулярные выражения. (Да по большому счету, до появления LEX и YACC в C они и не поддерживались.)
В Java подобных классов и методов нет (или я их пока не нашел).
Вот и все. И не надо требовать от пользователя знания регулярных выражений.

Автор: Kangaroo 31.1.2008, 17:37
Цитата(lazycat @  31.1.2008,  16:12 Найти цитируемый пост)
Странное утверждение.

Смайлы для твого и существует, чтобы передавать эмоции. Это была шутка, не принимайте близко к сердцу.

И вообще - это оффтоп. Пора заканчивать.

Автор: lazycat 31.1.2008, 19:30
Цитата

И вообще - это оффтоп. Пора заканчивать. 


Это точно.

Спасибо всем за участие

Автор: alex_nevolin 8.2.2008, 11:50
Подниму вопрос, но в новом ракурсе:
Есть шаблон для поиска файлов "*/popups/*" - найти все файлы в подпапках popups
Сделал regexp ".*/popups/.*" имплементировал фильтр:
Код

        final Pattern pattern = Pattern.compile(".*/popups/.*");
        File[] files = file.listFiles(new FileFilter() {
            public boolean accept(File file) {
                String canonicalPath = null;
                try {
                    canonicalPath = file.getCanonicalPath();
                } catch (IOException e) {
                    e.printStackTrace();
                    throw new RuntimeException(e);
                }
                return pattern.matcher(canonicalPath).matches();
            }
        });

Проблема в том что getCanonicalPath() is system-dependent. т.е. получаю разные слэши для Windows и Unix like систем. Для windows приходится делать regexp ".*\\\\popups\\\\.*"
Как с этим боротся? Решения System.getProperty("os.name") прошу не предлагать.
Может надо сам шаблон подстроить по обе оси? Может можно как-то работать с "file path" sytem independent?

Автор: Kangaroo 8.2.2008, 11:57
alex_nevolin, попробуйте использовать File.separator:
Код

Pattern.compile(".*"+File.separator+"popups"+File.separator+".*");

Автор: alex_nevolin 8.2.2008, 12:24
Kangaroo да думал я о File.Separator, только разница есть.
Windows: 
Код
 Pattern p = Pattern.compile(".*"+File.separator+File.separator+"popups"+File.separator+File.separator+".*");

Unix: 
Код
Pattern p = Pattern.compile(".*"+File.separator+"popups"+File.separator+".*");


Автор: LSD 8.2.2008, 12:31
Остановитесь, http://commons.apache.org/io/api-release/org/apache/commons/io/filefilter/WildcardFileFilter.html уже давно изобретен smile 

Автор: alex_nevolin 8.2.2008, 14:06
LSD: Бью челом!!! smile 

Автор: Kangaroo 8.2.2008, 14:09
LSD, 
что же ты в начале темы молчал  smile 


Цитата(alex_nevolin @  8.2.2008,  13:06 Найти цитируемый пост)
LSD: Бью челом!!! 

А я по-простому - плюса поставлю в репу.

Автор: LSD 8.2.2008, 14:52
Цитата(Kangaroo @  8.2.2008,  14:09 Найти цитируемый пост)
что же ты в начале темы молчал

Да я сам про него забыл, тока вспомнил smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)