如何分割线条,但保留标签?

时间:2015-06-27 13:54:15

标签: 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 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.

4 个答案:

答案 0 :(得分:4)

这个技巧应该有效。我暂时用" \ r" 替换了" \ n \ t" 。拆分字符串后,恢复" \ n \ t" 字符串。因此,您的数组将具有所需的字符串数。

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

{ "to": [{"phoneNumber": "+1XXXXXXXXXX"}], "from": {"phoneNumber": "+1XXXXXXXXXX"}, "text": "This is a message" } 

答案 1 :(得分:1)

什么是标签? 如果是4个空格,请使用以下模式:

string pattern = Environment.NewLine + @"(?!\s{4})";

如果是制表,请使用以下模式:

string pattern = Environment.NewLine + @"(?!\t)";

接下来,我们使用正则表达式:

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

答案 2 :(得分:1)

应该在正确的情况下使用正确的工具。为了避免使用一个可用的工具(一种用于各种编程语言的工具),这是愚蠢的。

当必须表达一个可以通过字符串函数完成或轻松完成的可辨别模式时,正则表达式是最佳的。下面我在最适合......的情况下使用每个工具。

以下是使用regex,string op和Linq的三阶段操作。

  1. 确定由于缩进规则必须将哪些行保持在一起。这样做是为了不在主拆分操作中丢失它们,操作将用管道符(\r\n\t)替换|以识别它们的特性。这是通过正则表达式完成的,因为我们能够以最小的开销有效地分组和处理操作。
  2. 我们用换行符分隔所有剩余的行,这让我们可以一瞥最终想要的行数。
  3. 我们通过linq' Select预测(更改)每一行,将|更改为\r\n
  4. 代码

    Regex.Replace(text, "\r\n\t", "|\t")
         .Split(new string[] { Environment.NewLine }, StringSplitOptions.None )
         .Select (rLine => rLine.Replace("|", Environment.NewLine));
    

    在此处尝试(.Net Fiddle

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

    结果第一:

    enter image description here

    完整代码

    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");
    

答案 3 :(得分:0)

分割完所有行后,您只需加入"像这样的标签线:

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
    }
}

如果您愿意,可以添加更复杂的逻辑来考虑不同数量的标签,但这应该可以让您入门。

如果您希望将多个标签行组合在一起,则可能需要使用StringBuilder代替string,以便在将这些行重新附加在一起时提高性能。