我正在编写解析大文件的软件。这个大文件表示使用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 "";
}
答案 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处的值传递给函数。如果不平衡的分隔符是一个问题,也许您可以预先计算它们以确保每个分隔符的数量相等。