In a directory with mixed content such as:
.afile
.anotherfile
bfile.file
bnotherfile.file
.afolder/
.anotherfolder/
bfolder/
bnotherfolder/
How would you catch everything but the files (not dirs) starting with .
?
^(?!\.).+?
but it doesn't seem to work 开发者_开发问答right.
Please note that I would like to avoid doing it by excluding the .
by using [a-zA-Z< plus all other possible chars minus the dot >]
Any suggestions?
This should do it:
^[^.].*$
[^abc]
will match anything that is not a, b or c
Escaping .
and negating the characters that can start the name you have:
^[^\.].*$
Tested successfully with your test cases here.
The negative lookahead ^(?!\.).+$
does work. Here it is in 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(".")
);
}
The output is (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
Note also the use of the non-regex String.startsWith
. Arguably this is the best, most readable solution, because regex is not needed anyway, and startsWith
is O(1)
where as the regex (at least in Java) is O(N)
.
Note the disagreement on the blank string. If this is a possible input, and you want this to return false
, you can write something like this:
!file.isEmpty() && !file.startsWith(".")
See also
- Is regex too slow? Real life examples where simple non-regex alternative is better
- In Java,
.*
even inPattern.DOTALL
mode takesO(N)
to match.
- In Java,
Uhm... how about a negative character class?
[^.]
to exclude the dot?
精彩评论