Mordejai:
Necesito encontrar el nombre de módulo automático dado un nombre de archivo de cuerdas, como:
"common-io-1.2.3.jar" -> "common.io"
"---apple...orange..jar" -> "apple.orange"
"google-api-v1-beta.jar" -> "google.api.v1.beta"
Sé que puedo utilizar ModuleFinder.of(Path)
, pero mi obligación es derivar sin ningún tipo de sistema de archivos IO.
Lo que he encontrado hasta el momento:
Mirando hacia arriba el código fuente cómo ModuleFinder.of()
funciona me encontré con este método , pero eso es demasiado para lo que necesito.
¿Cómo puedo hacerlo con una simple operación de expresiones regulares o cadena?
Mordejai:
Siguiendo esta 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;
}
También puede comprobar si se trata de un nombre de módulo válido:
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;
}