繁体   English   中英

正则表达式或String操作可从String派生自动模块名称

[英]Regex or String operation to derive automatic module name from String

我需要找到给定字符串名称的自动模块名称,如下所示:

"common-io-1.2.3.jar" -> "common.io"
"---apple...orange..jar" -> "apple.orange"
"google-api-v1-beta.jar" -> "google.api.v1.beta"

我知道我可以使用ModuleFinder.of(Path)但是我的要求是在没有任何文件系统IO的情况下派生它。

到目前为止,我发现:

在源代码中ModuleFinder.of()工作方式 ,我发现了此方法 ,但这对于我所需要的来说实在太多了。

如何使用简单的Regex或字符串操作来做到这一点?

遵循 JavaDoc:

public static String deriveModule(String filename) {

    // strip ".jar" at the end
    filename = filename.replaceAll("\\.jar$", "");

    // drop everything after the version
    filename = filename.replaceAll("-\\d.*", "");

    // all non alphanumeric get's converted to "."
    filename = filename.replaceAll("[^A-Za-z0-9]", ".");

    // strip "." at beginning and end
    filename = filename.replaceAll("^\\.*|\\.*$", "");

    // all double "." stripped to single
    filename = filename.replaceAll("\\.{2,}", ".");


    return filename;
}

您还可以检查它是否是有效的模块名称:

public static boolean isValidModuleName(String name) {
    String VALID_REGEX = "([\\p{L}_$][\\p{L}\\p{N}_$]*\\.)*[\\p{L}_$][\\p{L}\\p{N}_$]*";


    if (!name.matches(VALID_REGEX))
        return false;


    Set<String> keywords = Set.of("abstract", "continue", "for", "new", 
                    "switch", "assert", "default", "goto", "package",
                    "synchronized", "boolean", "do", "if", "private", "this",
                    "break", "double", "implements","protected", "throw", 
                    "byte", "else", "import", "public", "throws", "case", 
                    "enum", "instanceof", "return", "transient", "catch", 
                    "extends",  "int", "short", "try", "char", "final",
                    "interface", "static", "void", "class", "finally", 
                    "long", "strictfp", "volatile", "const",
                    "float", "native", "super", "while", "module", "open", 
                    "opens", "exports", "requires",
                    "transitive", "to", "with", "provides", "uses");


    String[] tokens = name.split("\\.");
    for (String t : tokens) {
        if (keywords.contains(t))
            return false;
    }

    return true;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM