如何拆分 Environment.NewLine?

6
我想要计算一段文本中的行数。
以下方法可以正常工作:
int numLines = copyText.Split('\n').Length - 1;

然而,在我的代码中我一直在使用 System.Environment.NewLine,当我尝试时:
 int numLines = copyText.Split(System.Environment.NewLine).Length - 1;

它一直在出现一个红色的波浪线,上面显示无法将字符串转换为字符。一直在尝试解决这个问题,但是没有成功。有人有什么想法吗?
3个回答

13

要在换行符上拆分,您可以使用以下内容:

copyText.Split(new string[] { System.Environment.NewLine },
               StringSplitOptions.None).Length - 1;

这里有一个参考链接,讲解了使用字符串数组的过载。请注意,System.Environment.NewLineSystem.String类型。在Windows系统中,它是一个由两个字符组成的字符串:\r\n;而在Unix系统中,它只有一个字符:\n。这就是为什么你不能将它用作字符的原因。
维基百科有一篇关于换行符的好文章:https://en.wikipedia.org/wiki/Newline。我建议你去阅读一下。

唯一的问题是,虽然它修复了红线,但我无法执行计数,因为当应该有5行时它返回0:int numberOfChar = copyText.Length - numLines; - BruceyBandit
@user21255:你说copyText.Split('\n').Length - 1;可以用对吧?如果你使用System.Environment.NewLine返回值为0,那就意味着这个字符串不包含System.Environment.NewLine。一个解决方案是继续使用之前的方法。这个字符串从哪里来的? - Jesse Good
它来自一个富文本框,无论文本框中出现什么文本,copyText都是该文本。实际上,这些文本来自一个进入富文本框的文本文件。 - BruceyBandit
@user21255:可能该txt文件使用的是Unix换行约定。您可以使用Notepad++进行检查 https://dev59.com/gHM_5IYBdhLWcg3wRw91 - Jesse Good

5

正如 @Jesse Good 所指出的那样,一个字符串中可能会出现多种不同的换行符。可以使用正则表达式来匹配可能出现在字符串中的各种换行符:

var text = "line 1\rline 2\nline 3\r\nline 4";

/* A regular expression that matches Windows newlines (\r\n),
    Unix/Linux/OS X newlines (\n), and old-style MacOS newlines (\r).
    The regex is processed left-to-right, so the Windows newlines
    are matched first, then the Unix newlines and finally the
    MacOS newlines. */
var newLinesRegex = new Regex(@"\r\n|\n|\r", RegexOptions.Singleline);
var lines = newLinesRegex.Split(text);

Console.WriteLine("Found {0} lines.", lines.Length);

foreach (var line in lines)
  Console.WriteLine(line);

输出:

共找到4行。
第1行
第2行
第3行
第4行


2

你需要使用接受 String[]重载方法

int numLines = copyText.Split(new[]{System.Environment.NewLine}, StringSplitOptions.None).Length - 1;

它解决了错误,但我有一个小问题与此相关,我在上面的答案下面的评论中提到了。 - BruceyBandit

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