如何在C#中有效地提取由大括号分隔的字符串?

时间:2016-11-28 02:17:43

标签: c# string parsing delimiter

我正在编写解析大文件的软件。这个大文件表示使用opening,{和closing,},大括号的新对象。在这些分隔符中,有更多相同类型的分隔符&图案。

我需要能够(有效地)从主字符串中提取外部括号的内容....

例如说我有一个包含以下数据的文件....

Jake James
87
{
    Henry James
    57
    {
        Lisa James
        18

        Luke James
        24
        {
            Bart James
            8
        }

        Dexter
        22
    }
}

我需要一个函数来提取一组分隔符中的所有内容,但是在同一级别上......所以如果将上面的内容放入一个名为sample的字符串中......我们可以这样做......

string extracted = ExtractStringBetweenDelimiters(sample, "{", "}");

哪会导致提取持有字符串

    Henry James
    57
    {
        Lisa James
        18

        Luke James
        24
        {
            Bart James
            8
        }

        Dexter
        22
    }

并保留剩余字符串的样本。

Jake James
87

我目前执行此操作的功能是这样的(它有效,但速度很慢)。

  static public string ExtractStringBetweenDelimiters(
     ref string original,
     string opening_delimiter,
     string closing_delimiter)
  {
     int first_delimiter = original.IndexOf(opening_delimiter);
     if (first_delimiter >= 0)
     {
        int total_open = 1;
        int opening_index = first_delimiter + opening_delimiter.Length;

        for (int i = opening_index; i < original.Length; i++)
        {
           // Check if we have room for opening_delimiter...
           if (i + opening_delimiter.Length <= original.Length)
           {
              for (int j = 0; j < opening_delimiter.Length; j++)
              {
                 if (original[i + j] != opening_delimiter[j])
                 {
                    break;
                 }
                 else if (j == opening_delimiter.Length - 1)
                 {
                    total_open++;
                 }
              }
           }


           // Check if we have room for closing_delimiter...
           if (i + closing_delimiter.Length <= original.Length)
           {
              for (int j = 0; j < closing_delimiter.Length; j++)
              {
                 if (original[i + j] != closing_delimiter[j])
                 {
                    break;
                 }
                 else if (j == closing_delimiter.Length - 1)
                 {
                    total_open--;
                 }
              }
           }


           if (total_open == 0)
           {
              // Extract result, and return it...
              string needle = original.Substring(opening_index, i - opening_index);
              if (original.Length > i + closing_delimiter.Length)
              {
                 original = original.Remove(first_delimiter, i + closing_delimiter.Length);

                 if (original.Substring(0, 1) == "\n")
                 {
                    original = original.Remove(0, 1);
                 }
              }
              else
              {
                 original = "";
              }

              if (needle.Substring(0, 1) == "\n")
              {
                 needle = needle.Remove(0, 1);
              }

              if (needle.Length > 0 && needle.Substring(needle.Length-1, 1) == "\n")
              {
                 needle = needle.Remove(needle.Length - 1, 1);
              }

              return needle;
           }
        }
     }

     return "";
  }

1 个答案:

答案 0 :(得分:0)

如何使用String.Substring()

public static string[] ExtractStringBetweenDelimiters(string sample, string open, string close)
{
    int openIndex = sample.IndexOf(open);
    int closeIndex = sample.LastIndexOf(close);

    var top = sample.Substring(0, openIndex);
    var bottom = sample.Substring(openIndex + 1, closeIndex - openIndex - 1);

    return new [] { top, bottom };          
}

这将从字符串的顶级获取结果。要获得下一级别,请将返回数组的索引1处的值传递给函数。如果不平衡的分隔符是一个问题,也许您可​​以预先计算它们以确保每个分隔符的数量相等。