正则表达式或字符串操作,用于从字符串派生自动模块名称



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

"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()的工作原理,我找到了这种方法,但这对于我需要的来说太多了。

如何使用简单的正则表达式或字符串操作来做到这一点?

遵循此 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;
}

最新更新