Регулярное выражение для определения формата имен файлов резервных копий - PullRequest
0 голосов
/ 01 октября 2009

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

Например, имя файла резервной копии может быть примерно таким: «backup_month_year_username.bak». У меня была идея сохранить формат в виде регулярного выражения. Для приведенного выше примера регулярное выражение будет выглядеть так:

"^backup_(?<Month>\d{2})_(?<Year>\d{2})_(?<Username>\w).(?<extension>bak)$"

Я подумал об использовании регулярных выражений, потому что мне также нужно будет просмотреть каталог резервных файлов, чтобы удалить те, которые старше определенной даты. Основная проблема, с которой я столкнулся, заключается в том, как создать имя файла с помощью регулярного выражения. В некотором смысле я должен заменить теги с информацией. Я мог бы сделать это, используя regex.replace и другое регулярное выражение, но я чувствую, что это странно, и это может быть лучше.

Спасибо

[Edit] Возможно, я не совсем понял с первого взгляда, но идея, конечно, в том, что пользователь (в данном случае администратор, который будет знать синтаксис регулярных выражений) будет иметь возможность изменить форму имени файла вот и вся идея, стоящая за этим [/ Edit]

Ответы [ 5 ]

1 голос
/ 01 октября 2009

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

Регулярные выражения могут - AFAIK - не использоваться для создания вывода, но только для проверки ввода, поэтому пользователь может указать две вещи:

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

EDIT
Кстати, ваш пример регулярного выражения содержит ошибку: «.» используется для «любого символа», также \w соответствует только одному символу слова, поэтому я думаю, что вы хотели написать

"^backup_(?<Month>\d{2})_(?<Year>\d{2})_(?<Username>\w+)\.(?<extension>bak)$"

1 голос
/ 01 октября 2009

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


Edit:

Создайте несколько предопределенных «заполнителей»:% u может быть именем пользователя,% y может быть годом и т. Д. :

backup_%m_%y_%u.bak

а потом просто заменить%? с их фактическими значениями.

0 голосов
/ 01 октября 2009

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

Regex rgx = new Regex("\(\?\<Month\>.+?\)");
rgx.Replace("^backup_(?<Month>\d{2})_(?<Year>\d{2})_(?<Username>\w+)\.(?<extension>bak)$"
, DateTime.Now.Month.ToString());

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

Что ты думаешь?

0 голосов
/ 01 октября 2009

С помощью решения Барта достаточно легко разделить (используя string.Split) сгенерированное имя файла, используя подчеркивание в качестве разделителя, чтобы получить информацию.

0 голосов
/ 01 октября 2009

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

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