文件与简单的文字与html混合 - 分割部分

时间:2017-02-20 12:47:16

标签: c# regex html-parsing

我需要从一些文件中解析一些文本并按部分拆分ti,取决于它是文本或html的简单文本部分。

让我们说,这是示例文本

This section should include any considerations for:

<ul>
    <li>C</li>
    <li>B</li>
    <li>A</li>
</ul>

h1. Support Contracts

<p>simple par</p>

它应该像那样拆分(使用JSON表示法,因为写入速度快,不管容器的类型是什么)

 [{
     part: 1,
     text: "This section should include any considerations for:" 
    }, 
    {
     part: 2,
     text:"<ul> <li>C</li><li>B</li> <li>A</li></ul>"
    },
    {
     part: 3,
     text:"h1. Support Contracts"
    },
    {
     part: 4,
     text:"<p>simple par</p>"
    }]

Html非常简单,所有标签都保证关闭(由程序生成)

哪种方式最快(不使用任何第三方库)?我可以在这里使用正则表达式完成这项任务吗?

1 个答案:

答案 0 :(得分:1)

如果我正确理解你的要求,我不确定我会用正则表达式解决这个问题。看起来只是简单地走动文本寻找标签并随时建立一个碎片列表。

var pieces = new List<string>();
int current = 0;
while (current < text.Length)
{
    var first = text.IndexOf('<', current);
    if (first != -1)
    {
        var second = text.IndexOf('>', first);
        if (second != -1)
        {
            var tag = text.Substring(first+1, (second-first-1));
            var closeTag = $"</{tag}>";
            var close = text.IndexOf(closeTag, second+1);
            if (close != -1)
            {
                close += closeTag.Length;
                if (current < first)
                {
                    pieces.Add(text.Substring(current, (first-current)).Trim());
                }
                current = close + 1;
                pieces.Add(text.Substring(first, (close-first)).Trim());
            }
            else
            {
                current = second + 1;
            }
        }
        else
        {
            current = first+1;
        }
    }
    else
    {
        pieces.Add(text.Substring(current).Trim());
        break;
    }
}