在具有混合内容的目录中,例如:
.afile
.anotherfile
bfile.file
bnotherfile.file
.afolder/
.anotherfolder/
bfolder/
bnotherfolder/
从.
开始,你如何捕获但的所有文件(不是dirs)?
我尝试了一个否定的预测^(?!\.).+?
,但似乎没有正常工作
请注意,我希望通过使用.
[a-zA-Z< plus all other possible chars minus the dot >]
来避免这样做
有什么建议吗?
答案 0 :(得分:18)
这应该这样做:
^[^.].*$
[^abc]
将匹配任何不 a,b或c
答案 1 :(得分:1)
答案 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
。可以说这是最好,最易读的解决方案,因为无论如何都不需要正则表达式,而startsWith
是O(1)
,因为正则表达式(至少在Java中)是O(N)
。
请注意空字符串的不一致。如果这是一个可能的输入,并且您希望它返回false
,您可以这样写:
!file.isEmpty() && !file.startsWith(".")
.*
即使在Pattern.DOTALL
模式下也需要O(N)
才能匹配。答案 3 :(得分:0)
呃......负面角色课怎么样?
[^.]
排除点?