Java + регулярное выражение, как проверить такую ​​строку «LOAD_filesourceB-01012008_000058.dat» для типа и номера (последние 6 цифр) - PullRequest
0 голосов
/ 13 мая 2009

как реализовать такое требование через регулярное выражение?

У меня есть список имен файлов как String.
LOAD_filesourceA-01012008-00001.dat
LOAD_filesourceB-01012008-00001.dat
LOAD_filesourceB-01012008-00003.dat
LOAD_filesourceA-01012008-00004.dat
LOAD_filesourceA-01012008-000055.dat
LOAD_filesourceB-01012008_000055.dat
...
LOAD_filesourceB-01012008_000058.dat
и т.д.

после загрузки каждого файла этот файл перемещается в каталог архива ... и я записываю тип файла и номер загрузки (последние 6 символов в имени файла)
У меня есть 2 части информации: 1- имеет ли файл, который я хочу загрузить, тип A или B 2- номер последнего загруженного файла в виде целого числа основываясь на них, я хотел бы получить имя файла следующего файла, то есть того же типа, и номер загрузки (= последние 6 цифр перед разделом ".dat") должен быть следующим доступным номером. скажем, загружено было 12, тогда я буду искать 13, если не доступно 14, 15 и т. д., пока не обработаю все файлы в этом каталоге.

только что с учетом строки типа «LOAD_filesourceB-01012008_000058.dat» я могу проверить, что это тип файла B, и, если последний загруженный номер файла был 57, он удовлетворяет требованию номера 58 (> 57 я имею в виду)

Ответы [ 3 ]

1 голос
/ 13 мая 2009

Смотрите это:

public class Match {

    Pattern pattern = Pattern.compile("LOAD_filesource(A|B)-[0-9]{8}[_-]([0-9]{5,6})\\.dat");

    String files[] = {
        "LOAD_filesourceA-01012008-00001.dat",
        "LOAD_filesourceB-01012008-00001.dat",
        "LOAD_filesourceB-01012008-00003.dat",
        "LOAD_filesourceA-01012008-00004.dat",
        "LOAD_filesourceA-01012008-000055.dat",
        "LOAD_filesourceB-01012008_000055.dat",
        "LOAD_filesourceB-01012008_000058.dat"
    };

    public static void main(String[] args) {
        new Match().run();
    }

    private void run() {
        for (String file : files) {
            Matcher matcher = pattern.matcher(file);

            System.out.print(String.format("%s %b %s %s\n", file, matcher.matches(), matcher.group(1), matcher.group(2)));
        }
    }
}

с этим выводом:

LOAD_filesourceA-01012008-00001.dat true A 00001
LOAD_filesourceB-01012008-00001.dat true B 00001
LOAD_filesourceB-01012008-00003.dat true B 00003
LOAD_filesourceA-01012008-00004.dat true A 00004
LOAD_filesourceA-01012008-000055.dat true A 000055
LOAD_filesourceB-01012008_000055.dat true B 000055
LOAD_filesourceB-01012008_000058.dat true B 000058
1 голос
/ 13 мая 2009

LOAD_filesource. (A | B) - [0-9] + - ([0-9]) + Даты

A или B окажутся в группе 1, номер файла в группе 2. Затем проанализируйте группу 2 как десятичное целое.

0 голосов
/ 13 мая 2009

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

LOAD_filesource(A|B)-[0-9]+[_-]([0-9])+.dat

Кроме того, ваше шестизначное число иногда составляет пять цифр (например, 00001 в LOAD_filesourceA -...- 00001.dat), но приведенное выше регулярное выражение требует наличия хотя бы одной цифры.

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

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