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

时间:2014-01-04 16:02:04

标签: c# string visual-studio

示例:

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”?

10 个答案:

答案 0 :(得分:53)

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

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

答案 1 :(得分:40)

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

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

答案 2 :(得分:18)

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

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

答案 3 :(得分:16)

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

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

答案 4 :(得分:4)

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

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

答案 5 :(得分:1)

首先,您的字符串无效。如果不使用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

答案 6 :(得分:1)

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

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

答案 7 :(得分: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();

答案 8 :(得分:0)

您可以使用Regex

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

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

static readonly FIRSTLINE_REGEX = new Regex(".*");

答案 9 :(得分:0)

单行解决方案:

string firstline = str.Split(new string[] { Environment.NewLine }, 2, StringSplitOptions.RemoveEmptyEntries);

这里第二个参数(= 2)表示找到第一行后,不再需要将行进一步拆分为数组,因此它的工作速度更快。