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

2022-08-31 14:34:05

直接来自这个Java Oracle教程:

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

任何人都可以从中举出一个真实的例子吗?“跨越目录边界”是什么意思?越过目录边界,我想像检查文件从根到.同样,一个真实的例子来解释*和**在实践中之间的区别将是伟大的。getNameCount()-1


答案 1

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

*.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();
});

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


答案 2

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


通配

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

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


分隔符和段 (/)

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

例:tests/HelloWorld.java

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


单星号 (*)

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

例:*.java

此 glob 将匹配诸如 或 之类的文件,但不匹配或 .HelloWorld.javatests/HelloWorld.javatests/ui/HelloWorld.java


双星号 (**)

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

例:tests/**/*.java

在这里,文件选择将被限制在目录中。glob 将匹配诸如 、 、 .teststests/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 将匹配类似 or 的文件tests/Cat.javatests/Bat.java


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

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

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

此 glob 将匹配诸如 、等文件...最多 .tests/feature1/HelloWorld.javatest/feature2/HelloWorld.java9


否定 (!)

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

例:tests/[!C]at.java

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


就是这样!希望有所帮助。


推荐