在.NET中换行符的最简单的方法是什么?

我需要在.NET中将字符串拆分成换行符,而我知道拆分字符串的唯一方法是使用Split方法。 但是,这不会让我(很容易)分裂一个换行符,那么最好的办法是什么?

要分割一个字符串,你需要使用带有一个字符串数组的重载:

string[] lines = theText.Split( new[] { Environment.NewLine }, StringSplitOptions.None ); 

编辑:
如果要在文本中处理不同类型的换行符,则可以使用匹配多个字符串的功能。 这将正确拆分任何一种类型的换行符,并保留文本中的空行和空格:

 string[] lines = theText.Split( new[] { "\r\n", "\r", "\n" }, StringSplitOptions.None ); 

怎样使用StringReader

 using (System.IO.StringReader reader = new System.IO.StringReader(input)) { string line = reader.ReadLine(); } 

你应该能够很容易地分割你的字符串,就像这样:

 aString.Split(Environment.NewLine.ToCharArray()); 

根据Guffa的回答,在扩展课程中,使用:

 public static string[] Lines(this string source) { return source.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.None); } 

尽量避免使用string.Split作为一个通用的解决方案,因为在内存中使用函数(原始字符串和分割副本)的任何地方都会使用更多的内存。 相信我,当你开始规模化运行一个32位的批处理应用程序来处理100MB文档时,这可能是一个棘手的问题,你会在八个并发线程中废话。 不是我以前去过那里

相反,使用这样的迭代器;

  public static IEnumerable<string> SplitToLines(this string input) { if (input == null) { yield break; } using (System.IO.StringReader reader = new System.IO.StringReader(input)) { string line; while( (line = reader.ReadLine()) != null) { yield return line; } } } 

这将使您可以在数据周围实现更高效的内存循环;

 foreach(var line in document.SplitToLines()) { // one line at a time... } 

当然,如果你想要所有的记忆,你可以做到这一点;

 var allTheLines = document.SplitToLines.ToArray(); 

对于一个字符串变量s

 s.Split(new string[]{Environment.NewLine},StringSplitOptions.None) 

这使用您的环境的行结束的定义。 在Windows上,行结束符是CR-LF(回车符,换行符)或C#的转义字符\r\n

这是一个可靠的解决方案,因为如果你用String.Join重新组合这些行,这就等于你的原始字符串:

 var lines = s.Split(new string[]{Environment.NewLine},StringSplitOptions.None); var reconstituted = String.Join(Environment.NewLine,lines); Debug.Assert(s==reconstituted); 

什么不该做:

  • 使用StringSplitOptions.RemoveEmptyEntries ,因为这将打破标记,如Markdown,其中空行有句法目的。
  • 拆分分隔符new char[]{Environment.NewLine} ,因为在Windows上这将为每一个新行创建一个空的字符串元素。

正则表达式也是一个选项:

  private string[] SplitStringByLineFeed(string inpString) { string[] locResult = Regex.Split(inpString, "[\r\n]+"); return locResult; } 

我目前在VB.NET中使用这个函数(基于其他答案):

 Private Shared Function SplitLines(text As String) As String() Return text.Split({Environment.NewLine, vbCrLf, vbLf}, StringSplitOptions.None) End Function 

它试图首先在平台本地换行符上分割,然后回退到每个可能的换行符。

到目前为止,我只需要一个类。 如果发生了变化,我可能会把这个Public转移到一个实用程序类,甚至可能使它成为一个扩展方法。

以下是如何连接备份线路的好办法:

 Private Shared Function JoinLines(lines As IEnumerable(Of String)) As String Return String.Join(Environment.NewLine, lines) End Function 

只是以为我会添加我的两位,因为这个问题上的其他解决方案不属于可重用的代码分类,并不方便。 以下代码块扩展了string对象,以便在使用字符串时可以作为自然方法使用。

 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Collections; using System.Collections.ObjectModel; namespace System { public static class StringExtensions { public static string[] Split(this string s, string delimiter, StringSplitOptions options = StringSplitOptions.None) { return s.Split(new string[] { delimiter }, options); } } } 

您现在可以使用任何字符串的.Split()函数,如下所示:

 string[] result; // pass a string, and the delimiter result = string.Split("My simple string", " "); // split an existing string by delimiter only string foo = "my - string - i - want - split"; result = foo.Split("-"); // you can even pass the split options param. when omitted it is // set to StringSplitOptions.None result = foo.Split("-", StringSplitOptions.RemoveEmptyEntries); 

要在换行符上分割,只需传递"\n""\r\n"作为分隔符参数即可。

评论: 如果微软实现了这个过载,那将会很好。

那么,实际上分裂应该做的:

 //Constructing string... StringBuilder sb = new StringBuilder(); sb.AppendLine("first line"); sb.AppendLine("second line"); sb.AppendLine("third line"); string s = sb.ToString(); Console.WriteLine(s); //Splitting multiline string into separate lines string[] splitted = s.Split(new string[] {System.Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries); // Output (separate lines) for( int i = 0; i < splitted.Count(); i++ ) { Console.WriteLine("{0}: {1}", i, splitted[i]); } 
 string[] lines = text.Split( Environment.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyStrings); 

RemoveEmptyStrings选项将确保您没有空条目,因为\ n跟在\ r之后

(编辑以反映评论:)请注意,它也将放弃文本中真正的空行。 这通常是我想要的,但它可能不是你的要求。

我不知道Environment.Newline,但我想这是一个非常好的解决方案。

我的尝试将是:

  string str = "Test Me\r\nTest Me\nTest Me"; var splitted = str.Split('\n').Select(s => s.Trim()).ToArray(); 

额外的.Trim删除任何\ r或\ n可能仍然存在(例如,当在窗口,但分裂一个字符串与OS X换行字符)。 虽然可能不是最快的方法。

编辑:

正如注释正确指出的那样,这也会删除行首或换行之前的空白。 如果您需要保留该空格,请使用其他选项之一。

愚蠢的答案:写入一个临时文件,所以你可以使用古老的File.ReadLines

 var s = "Hello\r\nWorld"; var path = Path.GetTempFileName(); using (var writer = new StreamWriter(path)) { writer.Write(s); } var lines = File.ReadLines(path); 
 // using System.IO; string textToSplit; if(textToSplit!=null) { List<string> lines = new List<string>(); using (StringReader reader = new StringReader(textToSplit)) { for (string line = reader.ReadLine(); line != null;line = reader.ReadLine()) { lines.Add(line); } } } 

其实很简单

VB.NET:

 Private Function SplitOnNewLine(input as String) As String Return input.Split(Environment.NewLine) End Function 

C#:

 string splitOnNewLine(string input) { return input.split(environment.newline); }