2016-06-09 2 views
1

Давайте:Почему glob: * соответствует любому пути в PathMatcher?

Path path = Paths.get("C:\\1.txt"); 

Следующий код печатает "истина":

PathMatcher matcher = FileSystems.getDefault().getPathMatcher("regex:.*"); 
System.out.println(matcher.matches(path)); 

, но следующий код печатает "ложные":

PathMatcher matcher = FileSystems.getDefault().getPathMatcher("glob:*"); 
System.out.println(matcher.matches(path)); 

Почему?

Я ожидал иметь true в обоих подходах.

Согласно Glob page from Wikipedia, шаблон * означает:

соответствует любому количеству любых символов не включая ни один

Детали:

  • Java 8
  • для Windows 7
+1

Вместо того, чтобы смотреть на Википедию, что означает этот глобус, я настоятельно рекомендую [смотреть документацию для 'getPathMatcher'] (https://docs.oracle.com/javase/7/docs/api/ Java/NiO/файл/FileSystem.html # getPathMatcher (java.lang.String)). Но он говорит что-то похожее: * «Символ \ * соответствует нулю или нескольким символам компонента имени без пересечения границ каталога». * Также обратите внимание: * «Символы \ * \ * соответствуют нулевому или нескольким символам, пересекающим границы директорий». * Возможно, вы хотите '**' (не знаете, никогда не использовали 'PathMatcher'). –

+0

Кроме того, из связанного вами Wikipage: 'COMMAND.COM и cmd.exe имеют большинство распространенного синтаксиса с некоторыми ограничениями: Нет [...], а * может появляться только в конце шаблона, а не в начало. ' –

+0

@JorgeCampos:' cmd.exe' на моей системе Windows 8 отлично с '*' в начале шаблона. –

ответ

1

Как @TJ Crowder сказал, что вы должны хорошо идти с этим:

PathMatcher matcher2 = FileSystems.getDefault().getPathMatcher("glob:**"); 
System.out.println(matcher2.matches(path)); 

Для получения дополнительной информации см this, который говорит:

В ** символов соответствует нулю или более символов, пересекающих справочник границ.

Смежные вопросы