Перечислите файлы с двумя точками в именах, используя регулярные выражения Java - PullRequest
1 голос
/ 15 апреля 2010

Я пытался сопоставить файлы в каталоге, в имени которого было две точки, что-то вроде theme.default.properties
Я думал, что шаблон .\\..\\.. должен быть требуемым шаблоном [. соответствует любому символу, а \. соответствует dot], но он соответствует oneTwo.txt и theme.default.properties

Я попробовал следующее:
[resources/themes имеет два файла oneTwo.txt и theme.default.properties]
1.

public static void loadThemes()
{
    File themeDirectory = new File("resources/themes");
    if(themeDirectory.exists())
    {
        File[] themeFiles = themeDirectory.listFiles();
        for(File themeFile : themeFiles)
        {
            if(themeFile.getName().matches(".\\..\\.."))
            {
                System.out.println(themeFile.getName());
            }
        }
    }
}

Это ничего не печатает

и следующие

File[] themeFiles = themeDirectory.listFiles(new FilenameFilter()
{
    public boolean accept(File dir, String name)
    {
    return name.matches(".\\..\\..");
    }
});

for (File file : themeFiles)
{
    System.out.println(file.getName());
}

печатает оба

oneTwo.txt
theme.default.properties

Я не могу найти, почему эти два дают разные результаты и какой шаблон я должен использовать, чтобы соответствовать двум точкам ...

Может кто-нибудь помочь?

Ответы [ 3 ]

5 голосов
/ 15 апреля 2010

Возвращается значение true, если имя файла содержит две точки в имени, разделенные символами слова:

matches("\\w+\\.\\w+\\.\\w+")

Соответствует следующему:

aaa.bbb.ccc
aaa.bbb.ccc
111.aaa.bbb
aaa.b_b.ccc
a.b.c

Не соответствует следующему:

aaa.bbb
..
.
---.aaa.bbb
aaa.bbb.ccc.ddd
a-a.bbb.ccc
2 голосов
/ 15 апреля 2010

Я не могу воспроизвести ваши выводы.

После удаления точки с запятой после if в вашем первом фрагменте обе версии ничего не выводят для меня. Обе версии должны печатать одинаковые имена файлов, а именно те, которые состоят из

a single character, a dot, a single character, a dot, a single character

Тест с дополнительным файлом с именем "a.b.c" печатает этот файл.

Если вы хотите сопоставить файлы, содержащие ровно две точки, используйте шаблон

"[^.]*\\.[^.]*\\.[^.]*"
1 голос
/ 15 апреля 2010

Другие возможности с меньшей головной болью:

Замените все, что является , а не точкой и подсчитайте вхождения:

public boolean accept(File dir, String name) {
    return name.replaceAll("[^.]", "").length() == 2;
}

или разбить на любую внутреннюю точку и сосчитать части:

public boolean accept(File dir, String name) {
    return name.split("\\.", -1).length - 1 == 2;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...