Регулярное выражение Java для извлечения определенной строки из строки предложения в файле - PullRequest
0 голосов
/ 09 ноября 2018

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

-dataFileName ABC.csv -command ii
-dataFileName EFG.csv -command ii
-dataFileName HIJ.csv -command ii
-dataFileName MNPQR.csv -command ii
-dataFileName UVXYZ.csv -command ii

Мы можем видеть, что -dataFileName [XXXX] -команда ii является своего рода повторяющимся

Я хочу ABC .csv, EFG .csv, HIJ .csv, MNPQR .csv, UVXYZ .csv, как вывод моей консоли.

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

Я не понимаю, почему вы хотите использовать регулярные выражения для этого. Вы можете легко написать для него простой парсер, который не вызовет проблем при изменении ваших требований (нужно обрабатывать кавычки? Достаточно просто с парсером, беспорядочно с регулярным выражением).

Пример программы, которая сделает это:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.StringReader;
import java.util.stream.Stream;

class Scratch {

    private static final String INPUT = "-dataFileName ABC.csv -command ii\n" +
        "-dataFileName EFG.csv -command ii -dataFileName OAZE.csv\n" +
        "-dataFileName HIJ.csv -command ii\n" +
        "-dataFileName MNPQR.csv -command ii\n" +
        "-dataFileName UVXYZ.csv -command ii";

    public static void main(String[] args) throws IOException {
        try (BufferedReader reader = new BufferedReader(new StringReader(INPUT))) {
            reader.lines()
                .flatMap(line -> fetchFilenamesFromArgumentLine(line, "dataFileName", "csv"))
                .forEach(System.out::println);
        }
    }

    public static Stream<String> fetchFilenamesFromArgumentLine(String line, String argumentName, String extension) {
        Stream.Builder<String> resultBuilder = Stream.builder();

        int index = 0;
        String actualArgumentName = "-" + argumentName + " ";

        while ((index = line.indexOf(actualArgumentName, index)) >= 0) {
            int start = index + actualArgumentName.length();
            int end = line.indexOf(extension, start) + extension.length();

            resultBuilder.add(line.substring(start, end));
            index = end;
        }
        return resultBuilder.build();
    }
}
0 голосов
/ 09 ноября 2018

Если вы просто хотите использовать повторение -dataFileName и -command ii в своих строках, то вы можете просто сделать это в Java,

replaceAll("-dataFileName| -command ii", "")

и напишите код примерно так:

public static void main(String args[]) throws Exception {
    List<String> list = Arrays.asList(
            "-dataFileName ABC.csv -command ii",
            "-dataFileName EFG.csv -command ii",
            "-dataFileName HIJ.csv -command ii",
            "-dataFileName MNPQR.csv -command ii",
            "-dataFileName UVXYZ.csv -command ii"
    );

    list.forEach(x -> {System.out.println(x + " --> " + x.replaceAll("-dataFileName| -command ii", ""));});
}

Это дает следующий вывод,

-dataFileName ABC.csv -command ii -->  ABC.csv
-dataFileName EFG.csv -command ii -->  EFG.csv
-dataFileName HIJ.csv -command ii -->  HIJ.csv
-dataFileName MNPQR.csv -command ii -->  MNPQR.csv
-dataFileName UVXYZ.csv -command ii -->  UVXYZ.csv

Если вам не нравится это, вы можете использовать это простое регулярное выражение, чтобы сделать работу,

-dataFileName (.*?) -command ii

и группа захвата 1.

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...