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



直接来自这个Java Oracle教程:

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

有人能从中做一个真实的例子吗?"跨越目录边界"是什么意思?越过目录边界,我想象像检查文件从根到getNameCount()-1。再次,在实践中解释*和**之间区别的真实示例会很棒。

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:\\*")  

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

/home/*直接在/home目录中说出每个文件。

/home/**说的是/home内任何目录中的每个文件。

<小时 />

***的例子。假设您当前的工作目录是 /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();
});

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

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

<小时 />

通配

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

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

<小时 />

分隔符和段 ( /

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

示例:tests/HelloWorld.java

在这里,testsHelloWorld.java是段,/是分隔符。

<小时 />

单星号 ( *

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

示例:*.java

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

<小时 />

双星号 ( **

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

示例:tests/**/*.java

在这里,文件选择将仅限于tests目录。glob 将匹配 tests/HelloWorld.javatests/ui/HelloWorld.javatests/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.javatest/feature2/HelloWorld.java等文件......最多9.

<小时 />

否定 ( !

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

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

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

<小时 />

就是这样!希望有帮助。

最新更新