Да, что-то не так с синтаксисом glob. Вам нужно удвоить каждую обратную косую черту, чтобы она оставалась без обратной косой черты в шаблонах глобуса.
Первый матчер:
PathMatcher pm = FileSystems.getDefault().getPathMatcher("glob:**\\subdir");
не соответствует пути, заканчивающемуся \subdir
. Скорее, двойная косая черта становится одиночной косой чертой в шаблоне глобуса, что означает, что 's' экранируется. А поскольку экранированный «s» - это просто «s», этот сопоставитель эквивалентен:
PathMatcher pm = FileSystems.getDefault().getPathMatcher("glob:**subdir");
, что означает, что он будет соответствовать любому пути, оканчивающемуся на subdir
. Таким образом, он будет соответствовать пути xxx\subdir
, но также будет совпадать с путями xxx\xxxsubdir
и xxxsubdir
.
Комбинированный подборщик:
PathMatcher pm = FileSystems.getDefault().getPathMatcher("glob:**\\{subdir,anotherdir}");
имеет ту же проблему. В этом случае избегается символ «{». В шаблоне glob это означает трактовать '{' как буквальный символ, а не как начало группы шаблонов. Таким образом, этот сопоставитель не будет соответствовать пути xxx\subdir
, но он будет соответствовать пути xxx{subdir,anotherdir}
.
Эти два сопоставителя будут делать то, что предназначено:
PathMatcher pm = FileSystems.getDefault().getPathMatcher("glob:**\\\\subdir");
PathMatcher pm = FileSystems.getDefault().getPathMatcher("glob:**\\\\{subdir,anotherdir}");