如何将带有换行符的字符串转换为单独的行?

时间:2010-08-23 08:27:55

标签: c#

如何将\r\n的字符串转换为行?

例如,取这个字符串:

string source = "hello \r\n this is a test \r\n tested";

如何将其转换为:

string[] lines ;

//lines[0] = hello;
//lines[1] = this is a test;
//lines[2] = tested ;

5 个答案:

答案 0 :(得分:3)

像这样使用String.Split Method (String[], StringSplitOptions)

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

无论源代码是使用Windows linebreak \r\n还是Unix \n编写,都可以使用。

正如其他答案所提到的,您可以使用StringSplitOptions.RemoveEmptyEntries代替StringSplitOptions.None,正如名称所示,它会删除空字符串(" "不符合空白条件,仅{{1} }}一样)。

答案 1 :(得分:1)

除了提到的string.Split之外,你还可以使用Regex.Split,但它对于更复杂的分割模式通常更有用。

var lines = Regex.Split( source, @"\r\n" );

答案 2 :(得分:0)

尝试

string[] items = source.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);

答案 3 :(得分:0)

string text = "Hello \r\n this is a test \r\n tested";
string[] lines = text.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
foreach (string line in lines) {
    System.Diagnostics.Debug.WriteLine(line);
}

您可以使用overloads of System.String.Split使用单个字符,字符数组或字符串值数组作为拆分字符串的分隔符。 StringSplitOptions指定是否保留空行或删除它们。 (例如,如果要分割多行文本(例如段落),则会保留它们,但会在名称列表的示例中将其删除)

答案 4 :(得分:0)

为清楚起见,我做了另一个答案。

我已经制作了这两种扩展方法:

ReadLines将允许您在不将整个字符串解析为数组的情况下读取一行。 ReadAllLines会将整行解析为数组。

在您的情况下,您可以使用它:

var lines = source.ReadAllLines();

我从File.ReadLinesFile.ReadAllLines获取了名称,因此它们应与.Net框架的其余部分保持一致。

作为对我的其他答案的评论的旁注,我已经检查了StringReader.ReadLine的代码,这确实照顾了\r\n\n - 但不是旧的旧版Mac Os等(不应该重要)。

public static class StringExtensions
{
    public static IEnumerable<string> ReadLines(this string data)
    {
        using (var sr = new StringReader(data))
        {
            string line;

            while ((line = sr.ReadLine()) != null)
                yield return line;
        }
    }

    public static string[] ReadAllLines(this string data)
    {
        var res = new List<string>();

        using (var sr = new StringReader(data))
        {
            string line;

            while ((line = sr.ReadLine()) != null)
                res.Add(line);
        }

        return res.ToArray();
    }
}

ReadAllLines本可以用ReadLines.ToArray制作,但我认为额外的几行代码比包裹IEnumerable更好,这需要一些处理时间)