直接来自this Java Oracle教程:
两个星号**的作用类似于*但跨越目录边界。这个 语法通常用于匹配完整路径。
有人可以做一个真实的例子吗?
他们对“十字架目录边界”有什么意义?
穿过目录边界,我想象一下从根到getNameCount()-1
检查文件。
再一个解释 practice 中*和**之间差异的真实例子会很棒。
答案 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
此处,tests
和HelloWorld.java
是分段,/
是分隔符。
*
)单个星号(*)与 one 段中的零个或多个字符匹配。用于将文件放在一个目录中。
示例:*.java
此glob将匹配文件HelloWorld.java
,但不匹配文件tests/HelloWorld.java
或tests/ui/HelloWorld.java
。
**
)双星号(**
)在多个段中匹配零个或多个字符。它用于遍历嵌套目录中的文件。
示例:tests/**/*.java
在这里,文件选择将限于tests
目录。全局文件将匹配文件tests/HelloWorld.java
,tests/ui/HelloWorld.java
,tests/ui/feature1/HelloWorld.java
。
?
)问号(?
)与一个句段中的单个字符匹配。它可用于匹配名称仅相差一个字符的文件或文件夹。
示例:tests/?at.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
。
就是这样!希望有帮助。