2017-04-18 52 views
0

我想使用正則表達式來獲得沒有擴展名的文件名。我無法讓正則表達式返回一個值。我有這樣的:C#正則表達式獲取沒有擴展名的文件名?

string path = @"C:\PERSONAL\TEST\TESTFILE.PDF"; 
var name = Regex.Match(path, @"(.+?)(\.[^\.]+$|$)").Value; 

在這種情況下,name總是回來爲C:\PERSONAL\TEST\TESTFILE.PDF。我做錯了什麼,我認爲我的搜索模式是正確的?

(我知道我可以使用Path.GetFileNameWithoutExtension(path);但我特別想嘗試使用正則表達式)

+4

爲何要使用這個時候一個非常好的框架方法存在一個正則表達式?你可以使用一個正則表達式,但是你手上還會有一個額外的問題。 – Amy

+0

但爲什麼?尋找[麻煩](https://blog.codinghorror.com/regular-expressions-now-you-have-two-problems)? – dlatikay

+3

如果這只是爲了學習正則表達式,那很好,但是對此使用正則表達式絕對沒有理由。事實上,我認爲在解決大多數問題時,正則表達式應該是您的最後手段。 – juharr

回答

1

你需要Group[1].Value

string path = @"C:\PERSONAL\TEST\TESTFILE.PDF"; 
var match = Regex.Match(path, @"(.+?)(\.[^\.]+$|$)"); 
if(match.Success) 
{ 
    var name = match.Groups[1].Value; 
} 

match.Value返回Captures.Value這是整場比賽

match.Group[0]始終與match.Value

match.Group[1]返回第一個捕獲值

例如:

+0

你能解釋一下爲什麼嗎? – Stefan

+0

它是'Groups [2] .Value',而不是'1'。 '0'是整個輸入字符串(因爲兩個捕獲組一起匹配整個事物),'1'是(不必要的)首先捕獲的組,'2'是第二個。 –

+0

@Stefan呃,我誤以爲你是OP。抱歉! –

1

由於數據是對字符串的右側,告訴正則表達式解析器從字符串的工作結束通過使用選項RightToLeft開始。這將顯着減少處理時間並減少實際需要的圖案。

下面的模式從左到右讀,並說,給我所有不是\字符(消耗/匹配到斜線,不再繼續),並開始消耗一段時間。

Regex.Match(@"C:\PERSONAL\TEST\TESTFILE.PDF", 
      @"([^\\]+)\.", 
      RegexOptions.RightToLeft) 
     .Groups[1].Value 

打印出

TESTFILE

0

可能會有點短,貪婪:

var name = Regex.Replace(@"C:\PERS.ONAL\TEST\TEST.FILE.PDF", @".*\\(.*)\..*", "$1"); // "TEST.FILE" 
相關問題