如何在C#中删除字符串的前n行?

19

我该如何删除字符串中的前n行?

示例:

String str = @"a
b
c
d
e";

String output = DeleteLines(str, 2)
//Output is "c
//d
//e"
8个回答

27
你可以使用LINQ:
String str = @"a
b
c
d
e";

int n = 2;
string[] lines = str
    .Split(Environment.NewLine.ToCharArray())
    .Skip(n)
    .ToArray();

string output = string.Join(Environment.NewLine, lines);

// Output is 
// "c
// d
// e"

5
你已经帮我做了,但你需要使用 StringSplitOptions.RemoveEmptyEntries,因为 Split 方法会单独解释 \r 和 \n。 - Marlon
1
@Marlon - 我不确定在问题中是否需要删除空条目。我认为不需要,因为问题的重点是行而不是字符/单词。 - Omar
4
你退缩了,不敢把所有内容放在一行中难以阅读的代码里?这就是所谓 LINQ 的正确使用方式吗? ;) - Massif

16
如果您需要考虑"\r\n"、"\r"和"\n",最好使用以下正则表达式:
public static class StringExtensions
{
    public static string RemoveFirstLines(string text, int linesCount)
    {
        var lines = Regex.Split(text, "\r\n|\r|\n").Skip(linesCount);
        return string.Join(Environment.NewLine, lines.ToArray());
    }
}

这里有关于将文本拆分成行的更多详细信息。


4
尝试以下操作:
public static string DeleteLines(string s, int linesToRemove)
{
    return s.Split(Environment.NewLine.ToCharArray(), 
                   linesToRemove + 1
        ).Skip(linesToRemove)
        .FirstOrDefault();
}

下面是一个例子:
string str = @"a
b
c
d
e";
string output = DeleteLines(str, 2);

返回

c
d
e

1
如果内容中有空行,则它们会被移除,导致返回错误结果。 - Gusman

3

你能将你提到的答案中相关的部分复制粘贴到你的回答中吗? - anon

1

试试这个:

public static string DeleteLines (string text, int lineCount) {
    while (text.Split('\n').Length > lineCount)
        text = text.Remove(0, text.Split('\n')[0].Length + 1);
    return text;
}

虽然可能不是很高效,但对我最近正在开展的小项目来说完全可行


你不应该在任何项目中像这样使用分割,而是将其声明为变量并重复使用。这是一个非常糟糕的习惯。 - Jiri Otoupal イり オトウパー

0

请尝试以下方法:

    private static string DeleteLines(string input, int lines)
    {
        var result = input;
        for(var i = 0; i < lines; i++)
        {
            var idx = result.IndexOf('\n');
            if (idx < 0)
            {
                // do what you want when there are less than the required lines
                return string.Empty;
            }
            result = result.Substring(idx+1);
        }
        return result;
    }

注意:此方法不适用于非常长的多行字符串,因为它不考虑内存管理。如果处理这些类型的字符串,建议您修改该方法以使用StringBuilder类。

为什么不直接找到第n个\n,然后从那个位置开始进行一次子字符串操作呢?上面的很多答案都非常低效,我本来期望有一个简单的方法来解决这个问题。我看到@Lukáš Novotný的回答就是这样做的(他在这里引用了,但没有重复)。 - iCollect.it Ltd

0

具有删除前n行或后n行的能力:

public static string DeleteLines(
     string stringToRemoveLinesFrom, 
     int numberOfLinesToRemove, 
     bool startFromBottom = false) {
            string toReturn = "";
            string[] allLines = stringToRemoveLinesFrom.Split(
                    separator: Environment.NewLine.ToCharArray(),
                    options: StringSplitOptions.RemoveEmptyEntries);
            if (startFromBottom)
                toReturn = String.Join(Environment.NewLine, allLines.Take(allLines.Length - numberOfLinesToRemove));
            else
                toReturn = String.Join(Environment.NewLine, allLines.Skip(numberOfLinesToRemove));
            return toReturn;
}

0
public static string DeleteLines(string input, int linesToSkip)
{
    int startIndex = 0;
    for (int i = 0; i < linesToSkip; ++i)
        startIndex = input.IndexOf('\n', startIndex) + 1;
    return input.Substring(startIndex);
}

1
最好在代码中包含一些上下文/解释,这样可以使答案对OP和未来的读者更有用(特别是因为这是一个旧问题,已经有几个其他高质量的答案)。 - EJoshuaS - Stand with Ukraine

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接