如何获得明确符号之间的字符串的中间部分?

时间:2013-08-30 11:38:34

标签: c# .net string

我有像这样的字符串:     “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);

我觉得应该有更简单,更好的方法。它是什么?

4 个答案:

答案 0 :(得分:5)

使用Path类:

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

答案 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

答案 2 :(得分:1)

您可以使用Path

和Path.GetFileNameWithoutExtension方法 http://msdn.microsoft.com/en-us/library/system.io.path.getfilenamewithoutextension.aspx

答案 3 :(得分: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);
}