2011-06-28 82 views
1
"blahblah\dummytext\_config.bat" 

如果我想從這個字符串中獲取_config.bat,那麼最好的方法是什麼?只有我能想到的方式是從.bat讀回它找到的第一個斜線,但我不知道該怎麼做。你可以在正則表達式中閱讀嗎?

+1

反向輸入字符串,正則表達式反向百通,...(: 但更嚴重的是,/\\.*?\.bat/將正則表達式的類型,你正在尋找或者使用類似/\\[^\\]\.bat/。 –

+7

爲什麼不使用建立的路徑類? –

+0

'/.*\\(((*)$/'然後最後的所有內容反斜槓將在捕獲組1中,不知道如何在C#中執行它,但是,當你可以使用內建的類時 – NorthGuard

回答

0

如果你想擁有的最後一個反斜槓後的一切,你可以使用下面的正則表達式:

.*\\(.*) 

捕獲組會得到你想要的結果。因爲默認情況下,第一個*是貪婪的,它會盡可能地匹配,因此也會消耗除最後一個之外的任何反斜槓(因爲不會再有匹配成爲可能)。

+0

這個wou ld在上面的字符串中沒有匹配。 – FlyingStreudel

+0

@FlyingStreudel它匹配(請參閱[這裏](http://ideone.com/Y6FhK)) – Howard

+0

您的答案中有2個正斜槓。把它們拿出來就可以了。 – FlyingStreudel

5

你可以找到爲lastIndexOf方法的最後一個反斜槓:

int index = myString.LastIndexOf(@"\"); 
string result = myString.SubString(index + 1); 

丹尼爾有一個好點。使用FileInfo的將是一個更安全的方式,很容易使用:

// myString doesn't need a full path either 
System.IO.FileInfo fi = new System.IO.FileInfo(myString); 
// returns just the file name without the path 
string result = fi.Name; 

並代理-J的提示:

string result = System.IO.Path.GetFileName(myString); 

如果路徑想要一個完整的路徑或不,我不知道。 FileInfo和Path都接受不存在的路徑和文件名。

+0

+ 1爲簡單和效率。 – FlyingStreudel

+2

+1在不需要時不使用正則表達式。 –

+0

如果它是一個文件名,爲什麼使用子字符串時'Path.GetFileName'會工作? +1無論如何 –

2

'$'匹配一行的結尾。所以,這個正則表達式會匹配一行或多行不是反斜線的字符,即您的示例字符串中的'_config.bat'。

[^\\]+$ 
0

下面就來看看背後的斜線(?<=\\)正則表達式的方法:

string fileName = @"blah\blah\_config.bat"; 
Regex.Match(fileName, @"(?<=\\)[^\\]+$")); 

但是,如果你在談論一個文件名,只需使用

string relativePath = @"blah\blah\_config.bat"; 
string fileName = Path.GetFileName(relativePath); 
+0

除非你想過濾出像「_config.bat」這樣的字符串,而在它們中沒有反斜槓,那麼這個後面是一個不必要的複雜。無論如何,我們應該鼓勵OP **而不是**以「落後」的方式來思考。 (具有諷刺意味的是,.NET確實支持無縫的從右到左的匹配,這是我知道的唯一的風格,但這不是這個工作的正確工具。) –

相關問題