Мне нужно поместить файлы в отдельные группы в соответствии с шаблоном в имени файла. Мне нужен идентификатор, который идентифицирует группу, к которой принадлежит файл. Неважно, как формируется этот идентификатор (за исключением того, что он не должен быть пустым), он должен быть одинаковым для всех файлов в группе. Я пытаюсь построить идентификатор непосредственно из файла в соответствии с этим правилом:Как сопоставить эти шаблоны с помощью регулярных выражений?
- удалить подстроку «Dokument» или «Signatur» с конца базового имени файла и предшествующий «_», если либо строка найдена
- удалить расширение
- предшествует результат с фиктивной строкой (например, «ID»), чтобы избежать пустой ID
- сделано.
Это должно быть возможно с помощью довольно простого регулярного выражения, но я не могу заставить его работать.
Вот моя попытка до сих пор:
for (<DATA>) {
my ($match) = ($_ =~ /(.*?)(?:dokument|signatur)?(?:\..*)/);
print $_ . " => id" . $match . "\n";
};
__DATA__
dokument.pdf
dokument.rtf
dokument.html
COO_2026_100_2_dokument.pdf
COO_2026_100_2.zip
dokument.xml
signatur.xml
COO_2026_100_2_dokument.xml
COO_2026_100_2_dokument.rtf
COO_2026_100_2_signatur.xml
COO_2026_100_3_dokument.xml
Что должно произойти: - dokument.*
и signatur.*
идут в одну группу - *_2*
перейти в другую группу - *_3*
переходит в третью группу
Что Случается, что все в порядке, за исключением zip-File, потому что у него нет «_» в его id. Я подозреваю, что это можно решить, посмотрев вперед, но я понятия не имею. И, может быть, я ошибаюсь.
Любые идеи?
Нет, как показывают данные примера, есть файлы, которые просто называются «dokument.xml» или «signatur.xml», поэтому нет «_». Я попробую ваше решение. – jackthehipster
ваше регулярное выражение производит различные идентификаторы, чем мне нужно. Правило в основном заключается в следующем: удалите «имя документа» или «signatur» из имени файла, а остальное - id. За исключением того, что нужно подписаться, это должно пойти так же хорошо. – jackthehipster
Я в замешательстве, вы говорите, что хотите * сохранить * расширение? Регулярное выражение в вашем вопросе подразумевает, что вы хотите его исключить, потому что оно заканчивается символом '(?: \ .. *)'. В противном случае я не понимаю, каким образом он не производит матчи, которые вы ищете. Можете ли вы включить в вопрос, какой именно результат вы хотите для каждого из этих имен файлов? –