Easiest way to split a string on newlines in .NET?

后端 未结 16 2332
抹茶落季
抹茶落季 2020-11-22 06:57

I need to split a string into newlines in .NET and the only way I know of to split strings is with the Split method. However that will not allow me to (easily) split on a ne

相关标签:
16条回答
  • 2020-11-22 07:29

    I just thought I would add my two-bits, because the other solutions on this question do not fall into the reusable code classification and are not convenient.

    The following block of code extends the string object so that it is available as a natural method when working with strings.

    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);
            }
        }
    }
    

    You can now use the .Split() function from any string as follows:

    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 parameter. When omitted it is
    // set to StringSplitOptions.None
    result = foo.Split("-", StringSplitOptions.RemoveEmptyEntries);
    

    To split on a newline character, simply pass "\n" or "\r\n" as the delimiter parameter.

    Comment: It would be nice if Microsoft implemented this overload.

    0 讨论(0)
  • 2020-11-22 07:30
    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);
            }
        }
    }
    
    0 讨论(0)
  • 2020-11-22 07:32

    To split on a string you need to use the overload that takes an array of strings:

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

    Edit:
    If you want to handle different types of line breaks in a text, you can use the ability to match more than one string. This will correctly split on either type of line break, and preserve empty lines and spacing in the text:

    string[] lines = theText.Split(
        new[] { "\r\n", "\r", "\n" },
        StringSplitOptions.None
    );
    
    0 讨论(0)
  • 2020-11-22 07:34

    I did not know about Environment.Newline, but I guess this is a very good solution.

    My try would have been:

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

    The additional .Trim removes any \r or \n that might be still present (e. g. when on windows but splitting a string with os x newline characters). Probably not the fastest method though.

    EDIT:

    As the comments correctly pointed out, this also removes any whitespace at the start of the line or before the new line feed. If you need to preserve that whitespace, use one of the other options.

    0 讨论(0)
  • 2020-11-22 07:36

    Based on Guffa's answer, in an extension class, use:

    public static string[] Lines(this string source) {
        return source.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.None);
    }
    
    0 讨论(0)
  • 2020-11-22 07:37

    Well, actually split should do:

    //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]);
    }
    
    0 讨论(0)
提交回复
热议问题