在JAVA中何时在glob语法中使用**(双星)

在JAVA中何时在glob语法中使用**(双星),java,path,nio,glob,matcher,Java,Path,Nio,Glob,Matcher,直接从Java Oracle教程: 两个星号***与*类似,但跨越了目录边界。这 语法通常用于匹配完整路径 有人能举个真实的例子吗? “跨越目录边界”是什么意思? 跨越目录边界,我想象一下将文件从根目录检查到getNameCount()-1。 再举一个真实的例子来解释*和**在实践中的区别会很好。的javadoc for有一些非常好的例子和解释 *.java Matches a path that represents a file name ending in .java *.* Ma

直接从Java Oracle教程:

两个星号***与*类似,但跨越了目录边界。这 语法通常用于匹配完整路径

有人能举个真实的例子吗? “跨越目录边界”是什么意思? 跨越目录边界,我想象一下将文件从根目录检查到
getNameCount()-1
。 再举一个真实的例子来解释*和**在实践中的区别会很好。

的javadoc for有一些非常好的例子和解释

*.java Matches a path that represents a file name ending in .java 
*.*    Matches file names containing a dot 

*.{java,class}  Matches file names ending with .java or .class 
foo.?           Matches file names starting with foo. and a single character extension 
/home/*/*       Matches /home/gus/data on UNIX platforms 
/home/**        Matches /home/gus and /home/gus/data on UNIX platforms 
C:\\*           Matches C:\foo and C:\bar on the Windows platform (note that the backslash is escaped; as a string literal in the Java Language the pattern would be "C:\\\\*")  
所以
/home/**
会匹配
/home/gus/data
,但
/home/*
不会匹配

/home/*
直接在
/home
目录中显示每个文件

/home/**
是指
/home
中任何目录中的每个文件


*
vs
***
的示例。假设您当前的工作目录是
/username/workspace/myproject
,则以下内容将仅与
/myproject
文件(目录)匹配

如果使用
**
,它将匹配该目录中的所有文件夹和文件。

双星号(
**
)匹配多个嵌套目录中的零个或多个字符。在解释主要概念之后,我将通过示例逐步解释双星号以及其他有用的通配符

PathMatcher pathMatcher = FileSystems.getDefault().getPathMatcher("glob:/Users/username/workspace/*");
Files.walk(Paths.get(".")).forEach((path) -> {
    path = path.toAbsolutePath().normalize();
    System.out.print("Path: " + path + " ");
    if (pathMatcher.matches(path)) {
        System.out.print("matched");
    }
    System.out.println();
});

文件名代换 glob是用于匹配文件路径的字符串文字和/或通配符。使用一个或多个glob在文件系统上定位文件称为globbing。全球化不仅仅局限于Java。它还用于匹配各种配置文件中的文件,例如在Git中的
.gitignore
中列出被忽略的文件和目录,在Unix操作系统中选择文件和文件夹,例如
ls**/*.java

以下是globbing最重要的部分。双星号(
**
)是其中之一:


分隔符和段(
/
) 在Globbing中,无论使用何种操作系统,正斜杠字符(
/
)始终充当分隔符。一段是两个分隔符之间的所有内容

示例:
tests/HelloWorld.java

这里,
tests
HelloWorld.java
是段,
/
是分隔符


单星号(
*
) 单个星号(*)匹配一段中的零个或多个字符。它用于对一个目录中的文件进行全局搜索

PathMatcher pathMatcher = FileSystems.getDefault().getPathMatcher("glob:/Users/username/workspace/*");
Files.walk(Paths.get(".")).forEach((path) -> {
    path = path.toAbsolutePath().normalize();
    System.out.print("Path: " + path + " ");
    if (pathMatcher.matches(path)) {
        System.out.print("matched");
    }
    System.out.println();
});
示例:
*.java

此glob将匹配
HelloWorld.java
等文件,但不匹配
tests/HelloWorld.java
tests/ui/HelloWorld.java
等文件


双星号(
**
) 双星号(
**
)匹配多个段中的零个或多个字符。它用于全局绑定嵌套目录中的文件

示例:
tests/***.java

这里,文件选择将限制在
tests
目录。glob将匹配文件,如
tests/HelloWorld.java
tests/ui/HelloWorld.java
tests/ui/feature1/HelloWorld.java


问号(
) 问号(
)匹配一段中的单个字符。它可用于匹配名称仅相差一个字符的文件或文件夹

示例:
tests/?位于.java

这将匹配文件,如
tests/cat.java
test/cat.java
test/bat.java


方括号(
[abc]
) 方括号(
[…]
)匹配方括号中给定的单个字符

示例:
tests/[CB]at.java

此glob将匹配文件,如
tests/Cat.java
tests/Bat.java


方括号范围(
[a-z]
) 方括号范围(
[a-z]
)与该范围内给定的一个字符匹配

示例:
tests/feature[1-9]/HelloWorld.java

此glob将匹配诸如
tests/feature1/HelloWorld.java
test/feature2/HelloWorld.java
等文件。。。最多
9


否定(
) 否定(
)用于排除某些文件

示例:
tests/[!C]at.java

这将排除文件
tests/Cat.java
,并将匹配文件,如
tests/Bat.java
tests/Bat.java
tests/Cat.java



就这样!希望有帮助。

这意味着它将递归地遍历所有子目录,其中*将只从当前目录中获取文件,而忽略子目录API似乎很好地涵盖了glob语法。谢谢,我正在寻找一些glob规范,但没有找到。谢谢again@Rollerball不客气。
PathMatcher
类似乎经常使用glob语法,因此您可能会更幸运地了解相关的方法和类。@Sotirios Delimanolis请提供代码示例和文件结构,当glob:*和glob:*返回不同的结果时。@M.a.Kishawy这取决于您试图匹配的对象。例如,
glob:*example.java
将匹配
/Users/me/workspace/which/example.java
,但
glob:*example.java
不会匹配。@M.A.Kishawy我不知道什么是
探路者。另外,
walkFileTree
,嗯……遍历整个文件树,因此您的全局模式不需要匹配任何内容。由于
walkFileTree
,将访问每个路径。