В каталоге со смешанным содержанием, таким как:
.afile
.anotherfile
bfile.file
bnotherfile.file
.afolder/
.anotherfolder/
bfolder/
bnotherfolder/
Как Вы поймали бы все кроме файлов (не директора) запускающийся с .
?
Я попробовал отрицательным предвидением ^(?!\.).+?
но это, кажется, не работает правильно.
Обратите внимание на то, что я хотел бы постараться не делать его исключением .
при помощи [a-zA-Z< plus all other possible chars minus the dot >]
Какие-либо предложения?
Это должно помочь:
^[^.].*$
[^abc]
будет соответствовать всему, что не a, b или c
Отрицательный просмотр вперед ^ (?! \.). + $
работает. Вот оно в 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
. Возможно, это лучшее и наиболее читаемое решение, потому что регулярное выражение в любом случае не требуется, а startWith
равно O (1)
, где как регулярное выражение (по крайней мере, в Java) - O (N)
.
Обратите внимание на разногласия по пустой строке. Если это возможный ввод, и вы хотите, чтобы он возвращал false
, вы можете написать что-то вроде этого:
!file.isEmpty() && !file.startsWith(".")
. *
даже в Pattern.DOTALL
режиме требует O (N)
для соответствия . Как насчет класса отрицательных символов?
[^.]
чтобы исключить точку?
Побег
и отрицание символов, с которых может начинаться имя, у вас есть:
^[^\.].*$
Успешно протестировано с вашими тест-кейсами здесь.