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);

我觉得应该有更简单更好的方法来做到这一点。它是什么?

4

4 回答 4

5

使用Path类:

string fullPath = @"d:\tmp\abc_list.csv";
string fileNameWOE = Path.GetFileNameWithoutExtension(fullPath);
string firstToken = fileNameWOE.Split('_').First();
于 2013-08-30T11:44:22.413 回答
2

您的解决方案很好,但如果文件名的另一部分(例如,其目录路径的一部分)有下划线,它就会中断。你应该稍微改变一下以避免这个问题:

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

当您的解决方案很好、健壮且易于理解时,就没有理由寻求更短的解决方案。当然你可以使用正则表达式,但是生成的单行解决方案的可读性要差得多:

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

这是ideone 上此解决方案的演示。

于 2013-08-30T11:42:12.507 回答
1

你可以使用Path

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

于 2013-08-30T11:42:27.397 回答
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);
}
于 2013-08-30T11:43:45.510 回答