2009-10-01 10 views
0

在我目前正在使用的應用程序中,我可以選擇創建硬盤上某個文件的自動備份。我想要做的是爲用戶提供配置文件名及其擴展名的可能性。用於定義備份文件名格式的正則表達式

例如,備份文件名可能類似於:「backup_month_year_username.bak」。我有想法以正則表達式的形式保存格式。對於上面的例子中,正則表達式看起來像:

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

我想過使用正則表達式,因爲我也將通過備份的文件的目錄瀏覽,刪除那些超過一定日期的。我現在面臨的主要問題是如何使用正則表達式創建文件名。在某種程度上,我應該用信息替換標籤。我可以使用regex.replace和另一個正則表達式來做到這一點,但我覺得這是一個很奇怪的做法,這可能是一個更好的方法。

感謝

[編輯]也許我是不是在第一次去是很清楚,但這個想法當然是用戶(在這種情況下,管理員會知道正則表達式語法),將有可能給修改文件名的形式,這就是它[/編輯]

回答

0

好吧,我想我已經找到了一種方法只使用正則表達式。正如我我使用組來獲取信息,我會用另一種正則表達式匹配的正則表達式替換爲值組:

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

好吧,這是一個真正的黑客,但至少它的作品,我只一種模式由用戶定義,如果正則表達式太複雜,它可能不起作用,但我認爲我可以處理這個問題。

你覺得呢?

+0

它不會工作。考慮'^(? \ w +)(? \ d {2})(? \ d {2})\。(? bak)$「' – 2009-10-01 15:20:36

0

如果文件名總是以這種形式背後的想法,沒有理由對一個正則表達式,因爲它更容易與string.Split處理...

1

...如果正則表達式發生變化,則幾乎不可能從給定的正則表達式重建字符串。


編輯:

創建一些預定義的 「佔位」:%ü可以是用戶名,%Y可能是一年,等:

backup_%m_%y_%u.bak 

,然後簡單更換 %?與他們的實際價值。

+0

那麼......關於如何解決問題的任何想法? – Gimly 2009-10-01 12:12:09

+0

@Gimly:看到編輯。 – 2009-10-01 12:18:45

+0

嗯,是的,這是我可以做的事情,但然後很難從生成的文件名取回信息。 – Gimly 2009-10-01 12:22:40

0

使用Bart的解決方案,很容易將使用下劃線作爲分隔符分割(使用string.Split)生成的文件名來獲取信息。

+0

是......但不是,因爲用戶可能選擇不以這種方式分隔其標籤。如果他說它的文件名是: 「backup%m%y-%u」,那麼我不能使用string.split來獲取信息。 – Gimly 2009-10-01 12:32:23

1

聽起來好像你正在嘗試使用正則表達式到從用戶應該能夠指定的模式創建文件名。

正則表達式 - 據我所知 - 不能用於創建輸出,但只驗證輸入,所以你必須在用戶指定兩兩件事:

  1. 文件名生產像巴特模式建議
  2. 正則表達式,可以幫助你分割文件名到他們的部分形式的驗證模式

編輯
順便說一句,您的示例正則表達式包含一個錯誤:「。「是用於‘任何字符’,也\w只匹配一個字字符,所以我猜你的意思是寫

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

+0

那麼,你認爲真的沒有別的辦法嗎?這正是我想避免的。有兩種不同的模式可能會導致兩個字符串不同的錯誤。 – Gimly 2009-10-01 12:53:53

+1

那麼,你可以讓用戶指定一個像Bart建議的格式模式,然後自己分析相同的模式,而不是使用正則表達式。 – 2009-10-01 13:01:14