Извлечь строку из файла на основе нескольких шаблонов в файле - PullRequest
0 голосов
/ 14 июля 2020

У меня есть несколько форматов, в которых требуемая строка может находиться в столбце файла csv. Форматы такие:

 NOTPROVIDED 3392076122/RFB/2006270519020060 
 

 3392076122 4031253506 RAMIN ABD ULJABAR AF/RFB/202006

 
 NOTPROVIDED 3392076122 EASTERN U/RFB/200627

Любой из вышеперечисленных форматов может появиться в файле, и мне нужно извлечь «3392076122» из всех вышеперечисленных шаблонов, и форматы являются динамическими c и будут продолжать меняться. Вместо того, чтобы каждый раз изменять код java и использовать подстроку et c, я ищу решение, которое можно динамически обновлять на лету с помощью некоторого механизма шаблонов, такого как FTL, Thymeleaf. Как этого добиться?

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

1 Ответ

0 голосов
/ 11 августа 2020

Возможно, это даст вам несколько подсказок о том, как извлекать с помощью регулярного выражения с учетом вашей входной строки:

public static void main(String[] args) {
    // We assume that the rows from the file has
    // been collected in as a String in this example.
    String appendedRowsFromFile = "NOTPROVIDED 3392076122/RFB/2006270519020060\n"
            + "dfgsaadsfdgfh 654323546723 gdfsgasgdfh 42354124354\n"
            + "3392076122 4031253506 RAMIN ABD ULJABAR AF/RFB/202006\n"
            + "dfgsaadsfdgfh 7e9587230957 gdfsgasgdfh 3049123845098\n"
            + "NOTPROVIDED 3392076122 EASTERN U/RFB/200627\n";

    String regex1 = "^\\w+\\s+(\\d+)/\\w+"; // "NOTPROVIDED 3392076122/RFB/2006270519020060\n"
    String regex2 = "^(\\d+)\\s+\\d+\\s+\\w+"; // "3392076122 4031253506 RAMIN ABD ULJABAR AF/RFB/202006\n"
    String regex3 = "^\\w+\\s+(\\d{10})\\s+\\w+"; // "NOTPROVIDED 3392076122 EASTERN U/RFB/200627\n"

    Matcher matcher = Pattern.compile(String.format("(?:%s|%s|%s)", regex1, regex2, regex3), Pattern.MULTILINE)
            .matcher(appendedRowsFromFile);
    while(matcher.find()) {
        String completeMatchNoGroup = matcher.group(0);
        Matcher matcher1 = Pattern.compile(regex1).matcher(completeMatchNoGroup);
        Matcher matcher2 = Pattern.compile(regex2).matcher(completeMatchNoGroup);
        Matcher matcher3 = Pattern.compile(regex3).matcher(completeMatchNoGroup);

        String wantedString = "NO_MATCH";
        if(matcher1.find()) {
            wantedString = matcher.group(1);
        } else if (matcher2.find()) {
            wantedString = matcher.group(2);
        } else if (matcher3.find()) {
            wantedString = matcher.group(3);
        }

        System.out.println("Extraction: \"" + wantedString + "\"");
        System.out.println("From match: " + completeMatchNoGroup);
        System.out.println("# # #");
    }
}

OUTPUT:

Extraction: "3392076122"
From match: NOTPROVIDED 3392076122/RFB
# # #
Extraction: "3392076122"
From match: 3392076122 4031253506 RAMIN
# # #
Extraction: "3392076122"
From match: NOTPROVIDED 3392076122 EASTERN
# # #
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...