【问题标题】:C# take a substring of a stringC#获取字符串的子字符串
【发布时间】:2011-12-27 05:06:12
【问题描述】:

仅当该文件没有特定模式时,我才从文件中取出一行。我想从该行中取出最后 3 个字符...我的代码是:

        while (!line.Contains(pattern))
        {
             String num = line.Substring((line.Length - 3), (line.Length - 2));
             System.Console.WriteLine(num);
        }

但我得到一个错误..

索引和长度必须引用字符串中的位置。 参数名称:长度

我为什么会这样?我在行尾前 3 个字符开始新字符串,并且在前 2 个字符停止.. :\

【问题讨论】:

  • 大概你的字符串长度少于 3 个字符。
  • 前 3 个字符开始,前 2 个字符停止 1 个字符。你想要 3 个字符还是 1 个字符?
  • 您的线路有多长?如果您不检查子字符串之前的长度,您肯定会产生问题。
  • 我不知道行长,因为它总是不一样...我只想要最后 3 个字符...
  • 只是把它扔掉,但可能有一个漂亮的 RegEx 方法可以一次解析所有行并匹配每行的最后 3 个字符。

标签: c# string substring


【解决方案1】:

子字符串需要一个偏移量,然后返回多个字符:

http://msdn.microsoft.com/en-us/library/aa904308%28v=VS.71%29.aspx

所以:

String num = line.Substring((line.Length - 3), 3);

这当然假设 line.Length > 3。您可以检查:

String num = (line.Length < 3) ? line : line.Substring((line.Length - 3), 3);

【讨论】:

  • +1 - 这个 Q 总是会吸引大量的答案,但你先到那里 ;-) 其他一些答案似乎认为应该从长度中减去 4,这显然是不正确的.
  • 这是不正确的。数组是从 0 开始索引的,所以没有 char 索引是line.Length
  • @rotman,想想一个长度为 3 的字符串。如果我取长度 -3,那么我得到零,这是第一个字符。
  • @rotman: 你能举个例子吗?
  • 是的,当我写答案时,我几乎输入了- 4,实际上不得不在纸上画出数组以确保我是对的:)
【解决方案2】:

Substring 的第二个参数是从第一个参数开始需要多少个字符。它应该看起来像这样: String num = line.Substring(line.Length - 3, 3);

【讨论】:

  • 啊,旧的无评论答案编辑。所以现在我必须对我的评论发表评论,所以我看起来不像个白痴。感谢您将 -4 更改为 -3。
  • 我又错了。对不起,伙计,要记住这一点。
【解决方案3】:

这很危险。如果线的长度小于 3 怎么办?你应该检查一下,否则你会得到一个异常。

此外,您应该使用here 描述的子字符串方法:

String num = line.Substring((line.Length - 3), 3);

【讨论】:

  • @AdamRalph:多么精巧而富有洞察力的评论。 ;)
【解决方案4】:

问题是您尝试获取的字符数多于数组的字符数。

扩展最适合这样的问题;)我的名字有些脏,但每个人都知道它会做什么——这是异常安全的子字符串:

public static string SubstringNoLongerThenSource(this string source, int startIndex, int maxLength)
{
    return source.Substring(startIndex, Math.Min(source.Length - startIndex, maxLength));
}

所以在你的确切问题中应该是这样的:

String num = line.SubstringNoLongerThenSource((line.Length - 3), 3);
System.Console.WriteLine(num);

如果您提供给函数的字符串有足够的字母,num 最多有 3 个字母:)

【讨论】:

    【解决方案5】:
    String num = line.Substring(line.Length - 3)
    

    【讨论】:

    • 解释你的 sn-p 会更有帮助。
    • 如果只指定子串的起始位置,则子串在其后作为一个整体。由于这种情况后面必须跟最后三个字母,所以 (Length-3) 足以指定。
    【解决方案6】:

    这是因为 Substring() 的最后一个参数应该是要提取的字符串的长度。

    在你的情况下应该是 3

    ,而不是line.Length - 2

    第一个参数也应该是:

    line.Length - 3

    【讨论】:

    • 你是对的,不知道我为什么放那个。我已经编辑了我的答案。
    猜你喜欢
    • 2014-12-13
    • 2011-05-25
    • 2015-07-07
    • 2011-11-05
    • 2012-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多