使用java正则表达式列出名称中带有两个点的文件

时间:2010-04-15 16:53:22

标签: java regex

我试图匹配名称中包含两个点的目录中的文件,例如theme.default.properties
我认为模式.\\..\\..应该是必需的模式[.匹配任何字符而\.匹配dot]但它匹配oneTwo.txt和{{1 }}

我尝试了以下内容:
[theme.default.properties有两个文件resources/themesoneTwo.txt]
1。

theme.default.properties

这不打印

以及

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());
}

我无法找到为什么这两个会给出不同的结果以及我应该使用哪种模式来匹配两个点......

有人可以帮忙吗?

3 个答案:

答案 0 :(得分:5)

如果文件名名称中有两个点,用单词字符分隔,则返回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

答案 1 :(得分:2)

我无法重现你的发现。

在第一个代码段中的if之后删除分号后,两个版本都没有为我打印任何内容。两个版本都应该打印相同的文件名,即由

组成的文件名
a single character, a dot, a single character, a dot, a single character

使用名为“a.b.c”的附加文件进行测试会打印该文件。

如果要匹配包含两个点的文件,请使用模式

"[^.]*\\.[^.]*\\.[^.]*"

答案 2 :(得分:1)

减轻头痛的另一种可能性:

替换点的所有内容并计算出现次数:

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;
}