Реформат FTP ссылок

178
29 декабря 2018, 00:40

Возникла проблема переделать FTP-ссылки к файлу на более "юзер-френдли" вид.

Сейчас ссылки имеют вид:

ftp://ftp.domain.com:22/path/to/the/file

Хочется конвертировать их под данный вид:

\\ftp\ftp\path\to\the\file

Делается это для того, чтобы пользователь мог, скопировав данную ссылку, перейти через Проводник к данному файлу и скачать/открыть его. Данный метод по изменению пишу на Java, решил с помощью регулярных выражений находить и изменять значения, но некоторые тест-кейсы не покрываются.

Сам метод:

public String reformatLink(String filePath) {
        return filePath
                .replaceAll("ftp://", "//")
                .replaceAll("((.domain.com(:[\\w]+)*)|(:[\\w]+))", "/ftp")
                .replaceAll("/", "\\\\");
    }

JUnit тест:

@Parameterized.Parameters
public static Collection<Object[]> sources() {
    return Arrays.asList(new Object[][]{
            {"ftp://ftp.domain.com:22/Temp_Users_Data/test/test.zip"},
            {"ftp://ftp:22/Temp_Users_Data/test/test.zip"},
            {"ftp://ftp/Temp_Users_Data/test/test.zip"},
            {"ftp://ftp.domain.com/Temp_Users_Data/test/test.zip"}});
}
@org.junit.Test
public void test() {
    String result = source
            .replaceAll("ftp://", "//")
            .replaceAll("((.domain.com(:[\\w]+)*)|(:[\\w]+))", "/ftp")
            .replaceAll("/", "\\\\");
    assertEquals("\\\\ftp\\ftp\\Temp_Users_Data\\test\\test.zip", result);
}

Значение ftp://ftp/Temp_Users_Data/test/test.zip не подходит под данное условие. Может стоит как-то переделать регулярку? Кто сталкивался с похожей проблемой, подскажите, пожалуйста.

Answer 1
String[] links = {"ftp://ftp.domain.com:22/Temp_Users_Data/test/test.zip",
        "ftp://ftp:22/Temp_Users_Data/test/test.zip",
        "ftp://ftp/Temp_Users_Data/test/test.zip",
        "ftp://ftp.domain.com/Temp_Users_Data/test/test.zip"};
for (String s : links) {
    s = "\\\\" + s.replaceFirst("ftp://", "").replaceFirst("([.:][^/]+)?/", "/ftp/").replace('/', '\\');
    System.out.println(s);
}

Напечатает:

\\ftp\ftp\Temp_Users_Data\test\test.zip
\\ftp\ftp\Temp_Users_Data\test\test.zip
\\ftp\ftp\Temp_Users_Data\test\test.zip
\\ftp\ftp\Temp_Users_Data\test\test.zip
READ ALSO
Метод в Java как метод str() / int() / bool () в Python

Метод в Java как метод str() / int() / bool () в Python

В общем я выучил Python, в нем можно просто написать

159
Придётся ли платить за Java 11?

Придётся ли платить за Java 11?

Читал какие-то английские статьи про обновление java 11, поддержку старых версий и тд

149
UPDATE сразу нескольких строк одним запросом

UPDATE сразу нескольких строк одним запросом

Есть таблица с primary key idЗапрос изменяет значение поля age для юзера с заданным id

169