Java:将文件模式转换为正则表达式模式

时间:2015-02-26 04:24:32

标签: java regex filepattern

我正在尝试创建一个将文件模式转换为java正则表达式模式的实用程序函数,我需要这样做以对目录中的文件进行通配符匹配。我想出了4个需要考虑的案例。案件足够吗?

    regexPattern = filePattern;
    // convert windows backslash to slash
    regexPattern = regexPattern.replace("\\", "/");
    // convert dot to \\.
    regexPattern = regexPattern.replace("\\.", "\\\\.z");
    // convert ? wildcard to .+
    regexPattern = regexPattern.replace("?", ".+");
    // convert * wildcard to .*
    regexPattern = regexPattern.replace("*", ".*");

2 个答案:

答案 0 :(得分:4)

有人已经这样做了: http://www.rgagnon.com/javadetails/java-0515.html

当你看到其他保留的正则表达式字符时(在What special characters must be escaped in regular expressions?中描述) 即.^$*+?()[{\|)也必须被转义,而不仅仅是点。

逐字符解析方法比使用String#replace(..)方法更安全。在后一种情况下,你必须要小心替换的顺序,这样你就不要替换你已经做过的事情(想象一下如果在你的例子中你首先用\\.替换点然后用反斜杠替换斜线会发生什么。)< / p>

但是,我担心这个例子并不适用于所有情况。这是因为globs的语法在不同的实现中是不同的,请参阅wikipedia entry

对于简单的Windows cmd模式,代码为:

public static String wildcardToRegex(String wildcard){
    StringBuffer s = new StringBuffer(wildcard.length());
    s.append('^');
    for (int i = 0, is = wildcard.length(); i < is; i++) {
        char c = wildcard.charAt(i);
        switch(c) {
            case '*':
                s.append(".*");
                break;
            case '?':
                s.append(".");
                break;
            case '^': // escape character in cmd.exe
                s.append("\\");
                break;
                // escape special regexp-characters
            case '(': case ')': case '[': case ']': case '$':
            case '.': case '{': case '}': case '|':
            case '\\':
                s.append("\\");
                s.append(c);
                break;
            default:
                s.append(c);
                break;
        }
    }
    s.append('$');
    return(s.toString());
}

除了*?^w应该转换为w而不是&#39; \ w`之外,这不能很好地转义其他字符。正则表达式中的特殊含义)但你可以很容易地改进它。

答案 1 :(得分:1)

FileSystem.getPathMatcher(String)支持glob syntax

来自"Finding Files" tutorial

PathMatcher matcher =
    FileSystems.getDefault().getPathMatcher("glob:*.{java,class}");

Path filename = ...;
if (matcher.matches(filename)) {
    System.out.println(filename);
}
相关问题