C# 如何拆分行,但保留带制表符的行?

C# 如何拆分行,但保留带制表符的行?,c#,split,string-split,C#,Split,String Split,我知道如何用新线分开一根长绳子 string[] lines = d.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries); 但是我想 Split in new lines like this and in new lines + tabs like this, in order to have an array which contains the firs

我知道如何用新线分开一根长绳子

string[] lines = d.Split(new string[] { Environment.NewLine },
    StringSplitOptions.RemoveEmptyEntries);
但是我想

Split in new lines like this
and in new lines + tabs
    like this, in order to have
    an array which contains the first line and this second block.
基本上,我不想按一条规则分割,而是按两条规则分割。 结果数组应包含以下字符串:

[0] Split in new lines like this
[1] and in new lines + tabs
    like this, in order to have
    an array which contains the first line and this second block.

拆分所有行后,可以像这样“连接”选项卡行:

List<string> lines = d.Split(new string[] { Environment.NewLine })
                      .ToList();

// loop through all lines, but skip the first (lets assume it isn't tabbed)
for (int i = 1; i < lines.Count; i++)
{
    if (lines[i][0] == '\t') // current line starts with tab
    {
        lines[i - 1] += "\r\n" + lines[i]; // append it to prev line
        lines.RemoveAt(i); // remove current line from list
        i--; // and dec i so you don't skip an item
    }
}
List lines=d.Split(新字符串[]{Environment.NewLine})
.ToList();
//循环所有行,但跳过第一行(假设它不是选项卡式的)
对于(int i=1;i
您可以添加更复杂的逻辑来考虑不同数量的选项卡(如果您想要的话),但这应该让您开始。


如果希望将多个选项卡行组合在一起,您可能希望使用
StringBuilder
而不是
string
,以提高将这些行追加到一起的性能。

拆分所有行后,您可以像这样“连接”选项卡行:

List<string> lines = d.Split(new string[] { Environment.NewLine })
                      .ToList();

// loop through all lines, but skip the first (lets assume it isn't tabbed)
for (int i = 1; i < lines.Count; i++)
{
    if (lines[i][0] == '\t') // current line starts with tab
    {
        lines[i - 1] += "\r\n" + lines[i]; // append it to prev line
        lines.RemoveAt(i); // remove current line from list
        i--; // and dec i so you don't skip an item
    }
}
List lines=d.Split(新字符串[]{Environment.NewLine})
.ToList();
//循环所有行,但跳过第一行(假设它不是选项卡式的)
对于(int i=1;i
您可以添加更复杂的逻辑来考虑不同数量的选项卡(如果您想要的话),但这应该让您开始。


如果希望将多个选项卡式行组合在一起,则可能需要使用
StringBuilder
而不是
string
,以提高将行追加到一起的性能。

这一技巧应该有效。我已将“\n\t”临时替换为“\r”。拆分字符串后,还原回“\n\t”字符串。因此,您的数组行将具有所需的字符串计数

这样,您可以获得所需的输出:

d = d.Replace("\n\t", "\r");

string[] lines = d.Split(new string[] {"\n"}, StringSplitOptions.RemoveEmptyEntries);

lines = lines.Select((line) => line = line.Replace("\r", "\n\t")).ToArray();

这个把戏应该管用。我已将“\n\t”临时替换为“\r”。拆分字符串后,还原回“\n\t”字符串。因此,您的数组行将具有所需的字符串计数

这样,您可以获得所需的输出:

d = d.Replace("\n\t", "\r");

string[] lines = d.Split(new string[] {"\n"}, StringSplitOptions.RemoveEmptyEntries);

lines = lines.Select((line) => line = line.Replace("\r", "\n\t")).ToArray();
什么是账单? 如果为4个空格,请使用以下模式:

string pattern = Environment.NewLine + @"(?!\s{4})";
string pattern = Environment.NewLine + @"(?!\t)";
如果是表格,请使用以下模式:

string pattern = Environment.NewLine + @"(?!\s{4})";
string pattern = Environment.NewLine + @"(?!\t)";
接下来,我们使用正则表达式:

string[] lines = Regex.Split(text, pattern);
什么是账单? 如果为4个空格,请使用以下模式:

string pattern = Environment.NewLine + @"(?!\s{4})";
string pattern = Environment.NewLine + @"(?!\t)";
如果是表格,请使用以下模式:

string pattern = Environment.NewLine + @"(?!\s{4})";
string pattern = Environment.NewLine + @"(?!\t)";
接下来,我们使用正则表达式:

string[] lines = Regex.Split(text, pattern);

一个人应该在正确的情况下使用正确的工具。避免使用任何人都可以使用的工具(顺便说一句,每个编程语言中都有这种工具)是愚蠢的

当一个可识别的模式必须用字符串函数来表示,而字符串函数不能或很容易做到时,正则表达式是最好的。下面我使用的每一个工具的情况下,它是最好的设计


下面是使用regex、string op和Linq的三阶段操作

  • 确定由于缩进规则,哪些行必须保持在一起。这样做是为了在主拆分操作中不会丢失它们,该操作将用管道字符(
    |
    )替换
    \r\n\t
    ,以标识它们的专业。这是通过regex完成的,因为我们能够以最小的开销有效地分组和处理操作
  • 我们用换行符分割所有剩余的行,这使我们可以瞥见所需的最终行数组
  • 我们通过linq的
    选择
    来投影(更改)每一行,以将
    更改为
    \r\n
  • 代码 在这里试试()


    在LinqPad中运行带有前后结果的完整代码。请注意,
    .Dump()
    仅在Linqpad中用于显示结果,而不是Linq扩展

    结果一:

    完整代码

    string text = string.Format("{1}{0}{2}{0}\t\t{3}{0}\t\t{4}",
    Environment.NewLine,
     "Split in new lines like this",
     "and in new lines + tabs",
     "like this, in order to have",
     "an array which contains the first line and this second block.");
    
    text.Dump("Before");
    
    var result = Regex.Replace(text, "\r\n\t", "|\t")
                      .Split(new string[] { Environment.NewLine }, StringSplitOptions.None )
                      .Select (rLine => rLine.Replace("|", Environment.NewLine));
    
    result.Dump("after");
    

    一个人应该在正确的情况下使用正确的工具。避免使用任何人都可以使用的工具(顺便说一句,每个编程语言中都有这种工具)是愚蠢的

    当一个可识别的模式必须用字符串函数来表示,而字符串函数不能或很容易做到时,正则表达式是最好的。下面我使用的每一个工具的情况下,它是最好的设计


    下面是使用regex、string op和Linq的三阶段操作

  • 确定由于缩进规则,哪些行必须保持在一起。这样做是为了在主拆分操作中不会丢失它们,该操作将用管道字符(
    |
    )替换
    \r\n\t
    ,以标识它们的专业。这是通过regex完成的,因为我们能够以最小的开销有效地分组和处理操作
  • 我们用换行符分割所有剩余的行,这使我们可以瞥见所需的最终行数组
  • 我们通过linq的
    选择
    来投影(更改)每一行,以将
    更改为
    \r\n
  • 代码 在这里试试()


    在LinqPad中运行带有前后结果的完整代码。请注意,
    .Dump()
    仅在Linqpad中用于显示结果,而不是Linq扩展

    结果一:

    完整代码

    string text = string.Format("{1}{0}{2}{0}\t\t{3}{0}\t\t{4}",
    Environment.NewLine,
     "Split in new lines like this",
     "and in new lines + tabs",
     "like this, in order to have",
     "an array which contains the first line and this second block.");
    
    text.Dump("Before");
    
    var result = Regex.Replace(text, "\r\n\t", "|\t")
                      .Split(new string[] { Environment.NewLine }, StringSplitOptions.None )
                      .Select (rLine => rLine.Replace("|", Environment.NewLine));
    
    result.Dump("after");
    

    你想要什么还不清楚。定义特定规则(然后您可能会回答自己的问题)发布大量数据样本。我已经解析文本文件40多年了,可以提供帮助,但需要更大的输入样本。@jdweng-您不需要样本,您需要规则sso
    a\r\nb\r\n\tc1\r\n\tc2\r\nd
    变成
    {a”,“b”,“\tc1\r\n\tc2”,“d”