7

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

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

除了以 开头的文件(不是目录)之外,您将如何捕获所有内容.
我尝试过负面的前瞻^(?!\.).+?,但它似乎无法正常工作。
请注意,我想通过排除.使用来避免这样做[a-zA-Z< plus all other possible chars minus the dot >]

有什么建议么?

4

4 回答 4

19

这应该这样做:

^[^.].*$

[^abc]将匹配任何不是a、b 或 c 的东西

于 2010-05-25T22:18:24.530 回答
2

转义.和否定可以开始您拥有的名称的字符:

^[^\.].*$

在此处使用您的测试用例成功测试。

于 2010-05-25T22:21:36.213 回答
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(".")
        );
    }

输出是(如在 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(".")

也可以看看

于 2010-05-26T11:03:27.977 回答
0

嗯...负面角色课程怎么样?

[^.]

排除点?

于 2010-05-25T22:18:27.833 回答