如何只从字符串中获取第一行?

问题描述 投票:22回答:9

例:

string str = "Lorem ipsum dolor sit amet, 
consetetur sadipscing elitr, sed diam nonumy eirmod tempor 
invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum.";

string firstline;

如何从字符串“str”到字符串“firstline”的第一行?

c# string visual-studio
9个回答
16
投票

假设你的字符串确实包含新行(\r\n),你可以使用:

string line1 = str.Split(new [] { '\r', '\n' }).FirstOrDefault()

53
投票

而不是string.Split我会使用string.Substringstring.IndexOf只获得第一行,并避免使用整个输入字符串不必要的string[]

string firstline = str.Substring(0, str.IndexOf(Environment.NewLine));

40
投票

.NET已经有了一个读取器:StringReader。这样可以避免担心换行符的构成,以及字符串中是否存在换行符。

 string first = new StringReader(str).ReadLine();

18
投票

String.Split将创建一系列子串,这对您的要求是浪费的。我建议使用基于索引的方法:

int index = str.IndexOfAny(new char[] { '\r', '\n' });
string firstline = index == -1 ? str : str.Substring(0, index);

4
投票

使用LINQ,您可以使用一个简单的解决方案,避免最初将整个字符串拆分为字符串集合的开销。

string first = new string(str.TakeWhile(c => c != '\n').ToArray());

1
投票

按新行字符拆分并访问第一个元素。

 string[] test = Regex.Split(str, "[\r\n]+");
 String firstline= test[0];

1
投票

扩展方法可以做到:

public static class StringExtension
{
    /// <summary>
    /// Returns first line in a string or entire string if no linebreaks are included
    /// </summary>
    /// <param name="str">String value</param>
    /// <returns>Returns first line in the string</returns>
    public static string FirstLine(this string str)
    {
        if (string.IsNullOrWhiteSpace(str)) return str;
        var newLinePos = str.IndexOf(Environment.NewLine, StringComparison.CurrentCulture);
        return newLinePos > 0 ? str.Substring(0, newLinePos) : str;
    }
}

称之为:

var firstLine = $"abc{Environment.NewLine}def".FirstLine();

0
投票

首先,您的字符串无效。如果不使用verbtaim string literal,就不能有多行字符串。

你可以使用String.Split方法;

 string str = @"Lorem ipsum dolor sit amet, 
              consetetur sadipscing elitr, sed diam nonumy eirmod tempor 
              invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At                vero eos et accusam et justo duo dolores et ea rebum.";
var array = str.Split('\n');
Console.WriteLine(array[0]);

输出将是;

Lorem ipsum dolor sit amet,

这里有一个demonstration


0
投票

你可以使用Regex

string line = new Regex(".*").Match.Value;

默认情况下,Regex不是多行,因此它只匹配第一行。如果经常使用,你可以将Regex放在静态变量中,它是线程安全的:

static readonly FIRSTLINE_REGEX = new Regex(".*");
© www.soinside.com 2019 - 2024. All rights reserved.