正则表达式,用于定义备份文件名的格式

时间:2009-10-01 12:01:40

标签: c# .net regex vb.net

在我目前正在处理的应用程序中,我可以选择在硬盘上创建某个文件的自动备份。我想要做的是为用户提供配置文件名称及其扩展名的可能性。

例如,备份文件名可能类似于:“backup_month_year_username.bak”。我有想法以正则表达式的形式保存格式。对于上面的示例,正​​则表达式如下所示:

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

我考虑过使用正则表达式,因为我还必须浏览备份文件目录以删除早于某个日期的文件。我现在遇到的主要问题是如何使用正则表达式创建文件名。在某种程度上,我应该用信息替换标签。我可以使用regex.replace和另一个正则表达式来做到这一点,但我觉得这样做很奇怪,这可能是一种更好的方法。

由于

[编辑]也许我在第一时间并不是很清楚,但想法当然是用户(在这种情况下是一个知道正则表达式语法的管理员)将有可能修改文件名的形式,这就是它背后的所有想法[/编辑]

5 个答案:

答案 0 :(得分:1)

...如果正则表达式发生变化,则几乎不可能从给定的正则表达式重构字符串。


编辑:

创建一些预定义的“占位符”:%u可以是用户名,%y可以是年份等:

backup_%m_%y_%u.bak

然后简单替换%?与他们的实际价值。

答案 1 :(得分:1)

听起来您正在尝试使用正则表达式从用户应该能够指定的模式中创建文件名。

正则表达式可以--AFAIK - 不能用于创建输出,而只能用于验证输入,因此您可以让用户指定两件事:

  1. 像Bart建议的文件名制作模式
  2. 以正则表达式形式的验证模式,可帮助您将文件名拆分为其部分
  3. 修改
    顺便说一下,你的示例正则表达式包含一个错误:“。”用于“任何字符”,\w只匹配一个单词字符,所以我想你打算写

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

答案 2 :(得分:0)

如果文件名始终采用此格式,则没有理由使用正则表达式,因为使用string.Split处理更容易...

答案 3 :(得分:0)

使用Bart的解决方案,使用下划线作为分隔符,可以很容易地分割(使用string.Split)生成的文件名,以获取信息。

答案 4 :(得分:0)

好吧,我想我找到了一种只使用正则表达式的方法。当我使用组来获取信息时,我将使用另一个正则表达式来匹配正则表达式并用值替换组:

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

好吧,这真的是一个黑客,但至少它是有效的,我只有一个用户定义的模式。如果正则表达式过于复杂,它可能无效,但我认为我可以处理这个问题。

您怎么看?