【问题标题】:Regular expression to define format of backup filenames定义备份文件名格式的正则表达式
【发布时间】:2009-10-01 12:01:39
【问题描述】:

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

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

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

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

谢谢

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

【问题讨论】:

    标签: c# .net regex vb.net


    【解决方案1】:

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


    编辑:

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

    backup_%m_%y_%u.bak
    

    然后简单地替换 %?与它们的实际值。

    【讨论】:

    • 嗯,是的,这是我可以做的,但是从生成的文件名中取回信息真的很困难。
    • @Gimly:所以,你想从某个正则表达式生成一个有效的字符串,反之亦然:借助同一个正则表达式从某个文件名中提取信息?
    • 是的,这正是我想做的。
    • 但仍有太多信息缺少 IMO。读取文件名后,您应该如何知道管理员在特定时间选择了什么(我假设管理员可以更改格式,对吧)?我的意思是取文件名“backup_12.bak”,12 可以是月份或日期。如果没有额外的信息,这将无法可靠地逆转。
    • 是的,没错,这就是为什么我使用正则表达式中的组来指定月份、年份、用户名或其他内容。我已经在一个示例问题上尝试了我的解决方案,看起来它正在工作。它可能不是很优雅,但至少它是有效的。你怎么看?
    【解决方案2】:

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

    正则表达式可以 - AFAIK - 不能用于 create 输出,而只能用于 validate 输入,因此您需要用户指定两件事:

    1. 像 Bart 建议的文件名 production 模式
    2. 正则表达式形式的验证模式,可帮助您将文件名拆分为各个部分

    编辑
    顺便说一句,您的示例正则表达式包含一个错误:“。”用于“任何字符”,\w 也只匹配一个单词字符,所以我猜你的意思是写

    "^backup_(?&lt;Month&gt;\d{2})_(?&lt;Year&gt;\d{2})_(?&lt;Username&gt;\w+)\.(?&lt;extension&gt;bak)$"

    【讨论】:

    • 那么,你认为真的没有别的办法了吗?这正是我想要避免的。有两种不同的模式可能会导致两个字符串不同的错误。
    • 好吧,你可以让用户像 Bart 建议的那样指定格式模式,然后自己分析相同的模式,而不是使用正则表达式。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 是...但不是,因为用户可能会选择不以这种方式分隔其标签。如果他说它的文件名是:“backup%m%y-%u”,那么我不能使用 string.split 来获取信息。
      【解决方案5】:

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

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

      好的,这确实是一个 hack,但至少它可以工作,而且我只有一个用户定义的模式。如果正则表达式太复杂,它可能不起作用,但我想我可以解决这个问题。

      你怎么看?

      【讨论】:

      • 这行不通。考虑"^(?&lt;Username&gt;\w+)(?&lt;Year&gt;\d{2})(?&lt;Month&gt;\d{2})\.(?&lt;extension&gt;bak)$"
      猜你喜欢
      • 1970-01-01
      • 2019-02-14
      • 2013-05-30
      • 2022-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多