在Java中使用glob匹配路径字符串

时间:2014-07-10 13:20:55

标签: java glob

我将以下字符串作为全局规则:

**/*.txt

测试数据:

/foo/bar.txt
/foo/buz.jpg
/foo/oof/text.txt

是否可以使用glob规则(不将glob转换为regex)来匹配测试数据并返回valud条目?

一项要求:Java 1.6

3 个答案:

答案 0 :(得分:5)

如果您有Java 7可以使用FileSystem.getPathMatcher

final PathMatcher matcher = FileSystem.getPathMatcher("glob:**/*.txt");

这需要将您的字符串转换为Path

的实例
final Path myPath = Paths.get("/foo/bar.txt");

对于早期版本的Java,您可能会从Apache Commons' WildcardFileFilter。您也可以尝试从Spring的AntPathMatcher中窃取一些代码 - 这些代码与glob-to-regex方法非常接近。

答案 1 :(得分:2)

要添加到上一个答案:org.apache.commons.io.FilenameUtils.wildcardMatch(filename, wildcardMatcher) 来自Apache commons-lang库。

答案 2 :(得分:0)

FileSystem#getPathMatcher(String)是一种抽象方法,您不能直接使用它。您需要先获取一个FileSystem实例,例如默认值:

PathMatcher m = FileSystems.getDefault().getPathMatcher("glob:**/*.txt");

一些例子:

// file path
PathMatcher m = FileSystems.getDefault().getPathMatcher("glob:**/*.txt");
m.matches(Paths.get("/foo/bar.txt"));                // true
m.matches(Paths.get("/foo/bar.txt").getFileName());  // false

// file name only
PathMatcher n = FileSystems.getDefault().getPathMatcher("glob:*.txt");
n.matches(Paths.get("/foo/bar.txt"));                // false
n.matches(Paths.get("/foo/bar.txt").getFileName());  // true