我需要在. net中将字符串分割为换行符,我所知道的分割字符串的唯一方法是使用split方法。然而,这将不允许我(容易)在换行上分裂,那么最好的方法是什么?


当前回答

我只是想加上我的二进制,因为这个问题的其他解决方案不属于可重用代码分类,不方便。

下面的代码块扩展了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 parameter. When omitted it is
// set to StringSplitOptions.None
result = foo.Split("-", StringSplitOptions.RemoveEmptyEntries);

要在换行符上进行分割,只需传递“\n”或“\r\n”作为分隔符参数。

评论:如果微软能实现这个重载就太好了。

其他回答

Regex也是一个选项:

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

对于字符串变量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等标记,其中空行具有语法目的。 在分隔符上拆分新char[]{环境。因为在Windows上,这将为每一行创建一个空字符串元素。

我目前在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 str = "Test Me\r\nTest Me\nTest Me";
        var splitted = str.Split('\n').Select(s => s.Trim()).ToArray();

额外的. trim删除了任何可能仍然存在的\r或\n(例如在windows上,但是用os x换行符分隔字符串)。可能不是最快的方法。

编辑:

正如注释所正确指出的那样,这也会删除行开头或新换行之前的任何空白。如果需要保留空白,请使用其他选项之一。

使用StringReader怎么样?

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