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

时间:2013-09-10 15:04:56

标签: java path nio glob matcher

直接来自this Java Oracle教程:

  

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

有人可以做一个真实的例子吗? 他们对“十字架目录边界”有什么意义? 穿过目录边界,我想象一下从根到getNameCount()-1检查文件。 再一个解释 practice 中*和**之间差异的真实例子会很棒。

2 个答案:

答案 0 :(得分:60)

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内的任何目录中的每个文件。


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

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

答案 1 :(得分:6)

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


地球

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

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


分隔符和细分(/

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

示例:tests/HelloWorld.java

此处,testsHelloWorld.java是分段,/是分隔符。


单星号(*

单个星号(*)与 one 段中的零个或多个字符匹配。用于将文件放在一个目录中。

示例:*.java

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


双星号(**

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

示例:tests/**/*.java

在这里,文件选择将限于tests目录。全局文件将匹配文件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


就是这样!希望有帮助。