正则表达式捕获所有文件,但以“。”开头。

时间:2010-05-25 22:14:51

标签: regex dotfiles

在具有混合内容的目录中,例如:

.afile
.anotherfile
bfile.file
bnotherfile.file
.afolder/
.anotherfolder/
bfolder/
bnotherfolder/

.开始,你如何捕获的所有文件(不是dirs)?
我尝试了一个否定的预测^(?!\.).+?,但似乎没有正常工作 请注意,我希望通过使用.

排除[a-zA-Z< plus all other possible chars minus the dot >]来避免这样做

有什么建议吗?

4 个答案:

答案 0 :(得分:18)

这应该这样做:

^[^.].*$

[^abc]将匹配任何 a,b或c

答案 1 :(得分:1)

转义.并取消可以启动您所拥有名称的字符:

^[^\.].*$

使用您的测试用例here成功测试。

答案 2 :(得分:1)

否定前瞻^(?!\.).+$确实有效。这是Java:

    String[] files = {
        ".afile",
        ".anotherfile",
        "bfile.file",
        "bnotherfile.file",
        ".afolder/",
        ".anotherfolder/",
        "bfolder/",
        "bnotherfolder/",
        "", 
    };
    for (String file : files) {
        System.out.printf("%-18s %6b%6b%n", file,
            file.matches("^(?!\\.).+$"),
            !file.startsWith(".")
        );
    }

输出为(as seen on ideone.com):

.afile              false false
.anotherfile        false false
bfile.file           true  true
bnotherfile.file     true  true
.afolder/           false false
.anotherfolder/     false false
bfolder/             true  true
bnotherfolder/       true  true
                    false  true

还要注意使用非正则表达式String.startsWith。可以说这是最好,最易读的解决方案,因为无论如何都不需要正则表达式,而startsWithO(1),因为正则表达式(至少在Java中)是O(N)

请注意空字符串的不一致。如果这是一个可能的输入,并且您希望它返回false,您可以这样写:

!file.isEmpty() && !file.startsWith(".")

另见

答案 3 :(得分:0)

呃......负面角色课怎么样?

[^.]

排除点?