何时在 JAVA 中的 glob 语法中使用 **(双星号)
直接来自这个Java Oracle教程:
两个星号 **的工作方式类似于 *,但跨越目录边界。此语法通常用于匹配完整路径。
任何人都可以从中举出一个真实的例子吗?“跨越目录边界”是什么意思?越过目录边界,我想像检查文件从根到.同样,一个真实的例子来解释*和**在实践中之间的区别将是伟大的。getNameCount()-1
直接来自这个Java Oracle教程:
两个星号 **的工作方式类似于 *,但跨越目录边界。此语法通常用于匹配完整路径。
任何人都可以从中举出一个真实的例子吗?“跨越目录边界”是什么意思?越过目录边界,我想像检查文件从根到.同样,一个真实的例子来解释*和**在实践中之间的区别将是伟大的。getNameCount()-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();
});
如果使用 ,它将匹配该目录中的所有文件夹和文件。**
双星号 () 在多个嵌套目录中匹配零个或多个字符。在解释主要概念之后,我将逐步解释双星号以及其他有用的通配符。**
glob 是用于匹配文件路径的字符串文本和/或通配符。使用一个或多个 glob 在文件系统上定位文件称为通配。通配不仅限于 Java。它还用于匹配各种配置文件中的文件,例如在Git中列出忽略的文件和目录,在Unix操作系统中选择文件和文件夹,例如等。.gitignore
ls **/*.java
以下是通球的一些最重要的部分。双星号()就是其中之一:**
/
)在 Globbing 中,无论使用什么操作系统,正斜杠字符 () 始终充当分隔符。段是介于两个分隔符之间的一切。/
例:tests/HelloWorld.java
在这里,是段,是分隔符。tests
HelloWorld.java
/
*
)单个星号 (*) 匹配一个段中的零个或多个字符。它用于清除一个目录中的文件。
例:*.java
此 glob 将匹配诸如 或 之类的文件,但不匹配或 .HelloWorld.java
tests/HelloWorld.java
tests/ui/HelloWorld.java
**
)双星号 () 在多个段中匹配零个或多个字符。它用于清除嵌套目录中的文件。**
例:tests/**/*.java
在这里,文件选择将被限制在目录中。glob 将匹配诸如 、 、 .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 将匹配类似 or 的文件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
就是这样!希望有所帮助。