1

这是我的代码:

private string title(string pth) //I'm passing a path
{
    pth = System.IO.Path.GetFileNameWithoutExtension(pth); // I need an exact filename with no extension
    return pth.Substring(pth.IndexOf('-')+1, pth.Length).Trim(); // trying to return everything after '-'
}

它抛出一个异常。我不知道为什么。这是从文件名中获取标题的一种非常简单的方法,但它不起作用。

我试过pth.Length-1了,但它也不起作用。

4

8 回答 8

9

您正在使用允许您指定要提取的字符数的String.Substring方法版本。

但是,您将length参数作为字符串本身的整个长度提供 - 因此ArgumentOutOfRangeException.

如果您使用此版本的String.Substring,您可以提供单个参数 ( startIndex),然后您将自动获取字符串的其余部分,从您提供的索引开始。

因此,您可以从此更改代码:

return pth.Substring(pth.IndexOf('-')+1, pth.Length).Trim();

对此:

return pth.Substring(pth.IndexOf('-')+1).Trim();
于 2012-11-26T17:55:59.030 回答
2

Substring(int index, int length),length应该是子串的长度,而不是整个串的长度。

你要:

int index = pth.IndexOf('-');
return pth.Substring(index + 1, pth.Length - index - 1);
于 2012-11-26T17:56:29.670 回答
1

在这种情况下,我建议使用正则表达式。就像是:

private static string title(string pth)
{
   pth = System.IO.Path.GetFileNameWithoutExtension(pth); // I need an exact filename with no extension
   Match m = Regex.Match(pth, @".*\-(?<suffix>.*)$");

   Group suffix = m.Groups["suffix"];
   return suffix.Success ? suffix.Value : pth;
}

干净多了。

于 2012-11-26T18:00:51.603 回答
1

问题是您正在尝试检索比您指定的长度短的子字符串。此外,如果字符'-'位于字符串的末尾,您将收到异常,因为index+1将在字符串之外。这将有助于:

private string title(string pth) //I'm passing a path
    {
        pth = System.IO.Path.GetFileNameWithoutExtension(pth); // I need an exact filename with no extension
        string retStr = string.Empty;
        if(pth.IndexOf('-')<pth.Length-1)
        {
              retStr = pth.Substring(pth.IndexOf('-')+1).Trim(); // trying to return everything after '-'
        }
        return retStr;
    }
于 2012-11-26T17:56:38.243 回答
0

您需要像这样更改代码:

private string title(string pth) //I'm passing a path
{
  pth = System.IO.Path.GetFileNameWithoutExtension(pth);
  var indexOfDash = pth.IndexOf('-') + 1; // Add this line
  return pth.Substring(indexOfDash, pth.Length - indexOfDash).Trim();
}
于 2012-11-26T18:00:32.357 回答
0

我不知道你的例外是什么,但我假设-你的字符串中不存在。

如果您查看String.IndexOf 此处的文档,您将看到:

如果找到该字符串,则 value 的从零开始的索引位置,否则为 -1

当您subString使用-1起始索引执行 a 时,它将引发异常。

我会先检查是否存在-,然后如果找到你的子字符串:

if(pth.IndexOf('-') != -1)
{
    //Substring code
}
于 2012-11-26T17:56:07.143 回答
0

首先,你应该告诉我们你的例外是什么。这会有所帮助

pth.Substring(pth.IndexOf('-')+1, pth.Length)  

看起来它会抛出异常,因为它会尝试获取超出长度的子字符串。

尝试

pth.Substring(pth.IndexOf('-')+1)

反而

于 2012-11-26T17:56:19.577 回答
0

String.Substring 方法的第二个参数是子字符串的长度。在这种情况下,子字符串的长度应始终小于第 p 个字符串的长度。您可能打算这样做:

private string title(string pth) //I'm passing a path
{
    pth = System.IO.Path.GetFileNameWithoutExtension(pth);
    return pth.Substring(pth.IndexOf('-')+1, pth.Length - pth.IndexOf('-') - 1).Trim();
}
于 2012-11-26T17:57:49.173 回答