2012-12-20 50 views
0

我在C#中有以下內容。從文件路徑中刪除動態用戶名

string fileName = @"X:\Users\username\AppData\Local\foo.txt"; 

我想執行一個Regex.Replace,以便我得到以下內容。

string fileName = @"X:\Users\AppData\Local\foo.txt"; 

這將是很好使用正則表達式,允許驅動器盤符(X:)是動態的。實質上,我只需要放棄'username'部分。此外,請注意,用戶名只是用戶實際名稱的佔位符 - 因此可能是bob或larry或john或其他。正則表達式需要考慮到這一點。

,你可以指望在這裏要說的是,它會永遠與X:\Users\開始的事情(其中X:可C:D:,等等),然後將依次與一些字符串,然後將跟着一個\和那麼其他一些不重要的路徑元素。此外,在users or Users上進行不區分大小寫的匹配會很好。

我知道這可以在沒有Regex的情況下完成,但我需要這樣才能適應只提供Regex支持的較大系統。沒有支持像String.ReplaceString.Join這樣的東西。

+2

只是分裂('\')並從數組中刪除第二項,完成。 – sajanyamaha

+0

這比使用正則表達式更糟糕...... –

+2

'fileName = fileName.Replace(@「\ username」,「」);'會做到這一點,但爲什麼你需要使用正則表達式? – Habib

回答

0

你可以試試這個例子:

string fileName = @"X:\Users\username\AppData\Local\foo.txt"; 
Console.Write(Regex.Replace(fileName, @"([A-Z]{1}\:*\\Users\\)(\w+\\)(.*)", "$1$3")); 

說明:

  1. ([A-Z]{1}\:\\[Uu]sers\\) - 正則表達式的這部分字符的第一組,username之前,在路徑
    • ^表示行的開頭(刪除它忽略文件名前面的單詞)
    • [A-Z]{1}\:\\代表磁盤根路徑。你可以選擇你想要在這裏的盤符,像這樣:[CDX-Z]{1}。注意{1} - 這是約束意味着你只需要1個大寫字母。
    • [Uu]sers\\代表用戶的目錄名稱,注意組爲不區分大小寫用戶路徑 這是第一組,在更換模式refered作爲$1
  2. (\w+\\) - 正則表達式的這部分是第二組的字符,username,在路徑中
    • \w+\\代表至少一個單詞字符和\符號。 這是一個第二組,它是不是在更換圖案
  3. (.*) - 正則表達式的這部分是一個字符的第三組,所述username後,在路徑
    • .*表示任意字符後刪除\符號。

更新: 在現實世界中,我發現用戶名用空格,unicode字符和〜在裏面。因此,我將第2組替換爲包含任何字符,但是標記爲\

string fileName = @"X:\Users\username\AppData\Local\foo.txt"; 
Console.Write(Regex.Replace(fileName, @"([A-Z]{1}\:\\[Uu]sers\\)([^\\]*\\)(.*)", "$1$3")); 
+0

這真是太好了,謝謝! –

+0

我該如何調整它來忽略文件名前面的單詞? string filename = @「這個文件X:\ Users \ username \ foo.txt是文本。」 我想忽略「這個文件」,雖然這只是一個例子。謝謝! –

+0

@Raymond Parsons更新了答案 – VMAtm