C#获取字符串的子串

5

如果文件中没有特定的模式,我只从文件中获取一行数据。然后我想要从该行数据中获取最后三个字符...我的代码如下:

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

但是我遇到了一个错误..

索引和长度必须指向字符串内的位置。 参数名称: 长度

为什么会出现这种情况?我在行末开始新的字符串,并在倒数第二个字符处停止.. :\


你的字符串可能少于3个字符。 - AndrewC
1
从前三个字符开始,到倒数第二个字符结束,可以组成一个字符。你需要三个字符还是一个字符? - BoltClock
你的字符串有多长?如果在截取子字符串之前不检查长度,肯定会出现问题。 - SliverNinja - MSFT
我不知道行的长度,因为它并不总是相同的... 我只想要最后三个字符... - tequilaras
仅供参考,但可能有一个漂亮的正则表达式方法可以一次解析所有行并匹配每行的最后3个字符。 - Mike Christensen
6个回答

9
Substring函数接受一个偏移量和要返回的字符数: 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 - 这个问题一直会吸引大量回答,但你首先回答了它;-) 其他一些答案似乎认为应该从长度中减去4,这显然是不正确的。 - Adam Ralph
这是错误的。数组从0开始索引,因此没有一个字符的索引是 line.Length - rotman
@rotman,想象一下一个长度为3的字符串。如果我取长度-3,则得到零,它是第一个字符。 - Adam Ralph
@rotman:能否请您举个例子,说明这段代码何时会失败? - Vlad
是的,当我写我的答案时,我差点打错了“-4”,实际上我不得不在纸上画出数组来确保我是正确的 :) - Mike Christensen

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

1
啊,老的无评论答案编辑。现在我必须对我的评论进行评论,这样我就不会看起来像个白痴了。感谢您将-4更改为-3。 - Russell McClure
我又犯了错误。抱歉,伙计,得记住这个。 - rotman

1

这很危险。如果行的长度< 3怎么办?否则,您可能会收到异常消息,因此应该检查它。

此外,您应该使用如下所示的子字符串方法 here

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

@AdamRalph:多么精练而富有洞见的评论。 ;) - Russell McClure

1
问题在于你试图获取比数组长度更多的字符。
扩展程序最适合处理这类问题 ;) 我的程序名称有些不雅,但是每个人都知道它的作用——这是安全的子字符串操作。
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个字母 :)

0
String num = line.Substring(line.Length - 3)

1
解释你的代码片段会更有帮助。 - Pubby
如果您仅指定子字符串的起始位置,则该子字符串将从其后作为整体来处理。由于此情况必须跟随最后三个字母,因此指定(Length-3)即足够了。 - BLUEPIXY

-1
这是因为Substring()的最后一个参数应该是要提取的字符串的长度。
在您的情况下应该是3,而不是line.Length - 2。
第一个参数也应该是: line.Length - 3

你说得对,我也不知道为什么会这样写。我已经编辑了我的回答。 - Digbyswift

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接