如何在确定符号之间获取字符串的中间部分

本文关键字:字符串 获取 中间部 之间 符号 | 更新日期: 2023-09-27 18:29:34

我有如下字符串:"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);

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

如何在确定符号之间获取字符串的中间部分

使用Path类:

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

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

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

当您的解决方案美观、健壮且易于理解时,就没有理由选择较短的解决方案。当然,您可以使用正则表达式,但得到的单行解决方案可读性差得多:

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

下面是ideone上这个解决方案的演示。

您可以使用Path类

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

类似这样的东西:

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