2013-08-30 70 views
1

我有這樣的字符串: 「d:\ tmp目錄\ abc_list.csv」 「d:\ tmp目錄\ xyzx_list.csv」 「d:\ tmp目錄\ qwert_list.csv」 我需要的文件名的第一部分: abx,xyzc,qwert。我現在這樣做:如何獲得確定符號之間的字符串的中間部分?

string name = filename.Substring(filename.LastIndexOf('\\') + 1 , filename.IndexOf('_') - filename.LastIndexOf('\\') - 1); 

我覺得應該有更容易和更好的方式來做到這一點。它是什麼?

回答

2

你的解決方案很好,但是如果文件名的另一部分(比如說它的目錄路徑的一部分)有一個下劃線,它將會中斷。你應該稍微改變它來避免這個問題:

int pos = filename.LastIndexOf('\\') + 1; 
string name = filename.Substring(pos , filename.IndexOf('_', pos) - pos); 

當您的解決方案是好的,可靠和易於理解,沒有理由去爲更短的解決方案。當然,你可以使用正則表達式,但所得到的一個線的解決方案是遠不如可讀:

var res = Regex.Matches(s, @"(?<=\\)[^_\\]*(?=_[^\\]*$)")[0].Value; 

這裏是一個demo of this solution on ideone

1

事情是這樣的:

string str = @"d:\tmp\abc_list.csv"; 

// The preferred way to manipulate paths is to use the Path.* methods 
string str2 = Path.GetFileNameWithoutExtension(str); 

int ix = str2.LastIndexOf('_'); 

if (ix != -1) 
{ 
    str2 = str2.Remove(ix); 
} 
5

使用Path類:

string fullPath = @"d:\tmp\abc_list.csv"; 
string fileNameWOE = Path.GetFileNameWithoutExtension(fullPath); 
string firstToken = fileNameWOE.Split('_').First(); 
+1

ŧ他的獎金是將文件路徑視爲實際的文件路徑,而不是字符串,因此它具有內置處理所有文件路徑的特性。 – anaximander

+1

這是最好的答案。代碼是自我記錄的,它將正確處理正常的斜槓和反斜槓。 –

相關問題