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

Rol*_*all 48 java nio glob path matcher

直接来自这个 Java Oracle教程:

两个星号**的作用类似于*但跨越目录边界.此语法通常用于匹配完整路径.

有人可以做一个真实的例子吗?他们对"十字架目录边界"有什么意义?穿过目录边界,我想象从root到文件检查getNameCount()-1.再来一个真实的例子解释在*和**的区别做法将是巨大的.

Sot*_*lis 63

javadoc for FileSystem#getPathMatcher()有一些非常好的例子和解释

*.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:\\\\*")  
Run Code Online (Sandbox Code Playgroud)

所以/home/**会匹配/home/gus/data,但/home/*不会.

/home/*是直接在/home目录中说每个文件.

/home/**在说任何目录里面的每个文件/home.


*vs的例子**.假设您当前的工作目录是/Users/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();
});
Run Code Online (Sandbox Code Playgroud)

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


Yog*_*ity 11

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


流口水

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

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


分隔符和段 ( /)

在 Globbing 中,无论使用什么操作系统,正斜杠字符 ( /) 始终充当分隔符。一个片段是来自这两个分离器之间的一切。

例子: tests/HelloWorld.java

这里, testsandHelloWorld.java是段, and/是分隔符。


单个星号 ( *)

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

例子: *.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/?at.java

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


方括号 ( [abc])

方括号 ( [...]) 匹配方括号中给出的单个字符。

例子: tests/[CB]at.java

这个 glob 将匹配文件,如tests/Cat.javatests/Bat.java


方括号范围 ( [a-z])

方括号范围 ( [a-z]),匹配范围中给定的一个字符。

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

这个 glob 将匹配文件,如tests/feature1/HelloWorld.java,test/feature2/HelloWorld.java等等... upto 9


否定 ( !)

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

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

这将排除该文件tests/Cat.java并匹配tests/Bat.java, tests/bat.java,等文件tests/cat.java


就是这样!希望有帮助。