En mi aplicación Java, uso Azure Data Lake Storage Gen2 para almacenamiento ( ABFS ). En la clase que maneja las solicitudes al sistema de archivos, obtengo una ruta de archivo como entrada y luego uso algunas expresiones regulares para extraer la información de conexión de Azure.
El URI de Azure Data Lake Storage Gen2 tiene el siguiente formato:
abfs[s]://<file_system>@<account_name>.dfs.core.windows.net/<path>/<file_name> Uso la siguiente expresión regular abfss?://([^/]+)@([^\\.]+)(\\.[^/]+)/?((.+)?) para analizar un determinado ruta del archivo a extraer:
A continuación se muestra solo un código Java de prueba con comentarios que indican el resultado/valor en cada variable después de la coincidencia.
private void parsePath(String path) { //path = abfs://storage@myaccount.dfs.core.windows.net/selim/test.csv Pattern azurePathPattern = Pattern.compile("abfss?://([^/]+)@([^\\.]+)(\\.[^/]+)/?((.+)?)"); Matcher matcher = azurePathPattern.matcher(path); if (matcher.find()) { String fileSystem = matcher.group(1); //storage String accountName = matcher.group(2); //myaccount String accountSuffix = matcher.group(3); //.dfs.core.windows.net //relativePath is <path>/<file_name> String relativePath = matcher.group(4); //selim/test.csv } }El problema es cuando decidí usar Azurite , que es un servidor (emulador) compatible con Azure Storage API que me permite ejecutar pruebas unitarias contra este emulador en lugar de contra un servidor Azure real como se recomienda en la documentación de Microsoft.
Azurite usa un URI de archivo diferente al de Azure, por lo que esto hace que mi Regex anterior no sea válido para fines de prueba. El URI del archivo de Azurite tiene el siguiente formato:
abfs[s]://<file_system>@<local_ip>:<local_port>/<account_name>/<path>/<file_name> Azurite default account_name es devstoreaccount1 , por lo que aquí hay una ruta de ejemplo para un archivo en Azurite:
abfs://storage@127.0.0.1:10000/devstoreaccount1/selim/test.csvSi se analiza mediante la expresión regular anterior, esta será la salida, lo que provocará llamadas de API incorrectas al servidor de Azurite:
¿Es posible tener una expresión regular de 1 que pueda manejar ambos URI o 2 expresiones regulares para resolver este problema?