2014-02-06 133 views
1

提取文件名從路徑"//source/project/file.cs#232",我需要匹配file.cs正則表達式從P4路徑

Match myMatch = Regex.Match(path, @"(\w+\.\w+)[^/]*$"); 

這將使file.cs成羣[1]。

但是,對於文件名中帶有點的路徑,這不起作用。

path "//source/project/file.initial.config.cs#232" 

我怎麼能修改這個工作給file.initial.config.cs?

回答

1

試試這個正則表達式 - 也爲1組,並假設擴展只可以是字母,數字或下劃線:

.*/((?:.*?\.)+\w+) 

這可以變得更加健壯,如果有必要,在允許的知識用於文件命名的字符和後綴,以及有關嵌入此文件名的文本的詳細信息。例如,如果空間不允許作爲名稱的一部分

.*/((?:\S*?\.)+\w+) 

,或者是字母,數字或下劃線被允許:

.*/((?:\w*?\.)+\w+) 

如果我們可以放心,不會有任何點或在文件名中不允許序列中的最後一個點後,空間,空間,它可以進一步簡化爲:

.*/(\S*\.\w+) 

到最後的「/」和上一次的拿起一切「」以及最後一個「。」之後的任何單詞字符。

1

一些非 - 之前「#」「/」:

/([^/]+)# 
1

這應該讓你做你想要什麼,或者至少給你如何更好的主意實現它:

/(\w+)(?:\..*)(\w{2,3})\#) 

•例如:http://regex101.com/r/wQ9jG2

1

你能不能簡單地修改你的正則表達式從(\w+\.\w+)[^/]*$(\w+(\.\w+)+)[^/]*$,允許多次出現.words

1

爲什麼使用正則表達式,當你可以在c#中做到這一點?

我爲您創建了一個功能:

public static class FileNameHelper 
{ 
    public static string GetFileNameFromPath(string path, string extWithoutdot = "cs") 
    { 
     var startIndex = path.LastIndexOf('/') + 1; 
     var stringg = path.Substring(startIndex); 
     var remIndex = stringg.LastIndexOf("." + extWithoutdot) + extWithoutdot.Length+1; 
     return stringg.Remove(remIndex); 
    } 
} 

如何使用?

string filename=FileNameHelper.GetFileNameFromPath("//source/project/file.initial.config.cs#232","cs"); 

記住使用擴展不.

看到這個擁有超過正則表達式很多優勢。它們是:

  1. 它不是正則表達式!
  2. 其快速高效。
  3. 它的可讀性和純C#

注:不要使用在C#中的正則表達式瑣碎的事情。這絕對是對性能的一個打擊。首先想想在c#中實現它的方法。正則表達式應該是最後的手段。當然,如果表現不重要,請使用任何!

順便說一句,如果它有幫助,將其標記爲答案。 我知道它會幫助:)

1

如果你不反對,避免正則表達式,你可以用字符串處理的只是一個小位做到這一點:

string mypath = "//source/project/file.initial.config.cs#232"; 
string filename = GetFileName(mypath); 

static string GetFileName(string path) 
{ 
    var pathPieces = path.Split('/').Last().Split('#'); 
    var filename = pathPieces.Take(pathPieces.Length - 1); 
    return String.Join("#", filename); 
} 

更容易,並與工作任何任意的文件名(甚至包含空格或#字符的文件)。

編輯:現在使用文件名中包含#個字符的文件名,雖然這些文件名是Perforce中的highly discouraged

+1

如果文件名包含'#'會怎麼樣? – jamesdlin

+0

那些是不好的juju,但我已經編輯了我的答案來解釋它們。使它稍微複雜一些,但並不過分。 – Mark

0
(?<=/)[^/]+(?=#) 

使用環視,它只匹配文件名。