Java: Регулярное выражение для чтения файлов .dat с синтаксисом - 40 _ * _ p.dat - PullRequest
0 голосов
/ 18 марта 2020

Я получаю 17 типов файлов следующего формата:

85_*_p.dat
88_*_p.dat
32_*_p.dat
40_*_p.dat
41_*_p.dat
70_*_p.dat
22_*_p.dat
23_*_p.dat
46_*_p.dat
24_*_p.dat
25_*_p.dat
26_*_p.dat
52_*_p.dat
123_*_p.dat
28_*_p.dat
29_*_p.dat
35_*_p.dat

Где * любой идентификатор GUID, например "40_20200313_0cd6963f-bf5b-4eb0-b310-255a23ed778e_p.dat". Числа как 85, 88 и c. Интерфейс № Знак подчеркивания, а также "_p.dat" является общим для всех файлов.

Как написать регулярное выражение, включающее все перечисленные выше файлы?

Пробовал, но не работал:

/[22][23][24][25][26][28][29][32][35][40][41][46][52][70][85][88][123]_(?:.*)_p.dat/

Также пробовал:

\d[22|23|24|25|26|28|29|32|35|40|41|46|52|70|85|88|123]_(?:.*)_p.dat

Это ошибочно, как будто я добавляю 123, тогда он также выбирает 23

Также пробовал:

(22|23|123)_(?:.*)_p.dat

Это дает два результата с нормальным значением и группой 1

Не знаете, как с этим справиться

Примечание: Apache Верблюд имеет возможность читать файл SFTP с помощью регулярных выражений. Я хотел создать регулярные выражения для всех файлов выше. Но нужно то же самое для Java.

Ответы [ 2 ]

1 голос
/ 18 марта 2020

Ваш синтаксис неверен. Это регулярное выражение соответствует всем вашим именам файлов:

[0-9]+_[0-9a-z_-]+_p\.dat

Я выделю его и объясню.

[0-9]+ соответствует одной или нескольким цифрам, число в начале каждого имени файла (т.е. 22). Вы можете сделать его более точным, например c, как в своем примере, и сопоставить (22|23|24), который читается как 22 или 23 или 24.

_ соответствует подчеркиванию

[0-9a-z_-]+ соответствует части "GUID", которая может быть одним или несколькими числами, строчными буквами, подчеркиванием и дефисом

_p\.dat соответствует подчеркиванием, буквой p, точкой ( обратите внимание, что это экранируется \, потому что . является специальным символом регулярного выражения) и суффиксом dat в конце

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

0 голосов
/ 18 марта 2020

Вы можете сопоставить 1 или более цифр с повторяющимся шаблоном, который начинается с совпадения либо -, либо _, чтобы предотвратить последовательное совпадение __--

^\d+_[a-f0-9]+(?:[_-][a-f0-9]+)+_p\.dat$

Объяснение

  • ^ Начало строки
  • \d+_ Совпадение 1+ цифр и совпадение _
  • [a-f0-9]+ Совпадение 1+ раз af или 0-9
  • (?: Группа без захвата
    • [_-][a-f0-9]+ Соответствует либо _ или -, и 1+ раз по истечении, либо 0-9
  • )+ Закрыть группу без захвата и повторить 1+ раз
  • _p\.dat Совпадение _p.dat
  • $ Конец строки

Regex demo

Обратите внимание , что в Java вы должны дважды убежать от обратного слэса sh:

String regex = "^\\d+_[a-f0-9]+(?:[_-][a-f0-9]+)+_p\\.dat$";

Чтобы соответствовать этим числам Точно вы можете использовать чередование в сочетании с классами символов , чтобы соответствовать числам и немного сократить шаблон:

^(?:2[2-689]|3[25]|4[016]|52|70|8[58]|123)_[a-f0-9]+(?:[_-][a-f0-9]+)+_p\.dat$

Regex demo

...