提取最外层配对标签,放弃正则表达式-平衡组

 
 
 public List<string> 提取最外层配对标签(string 字符串)
    {
        List<string> html标签 = new List<string>();
        //============第一步,模仿平衡组,取出最外层标签,==========
        Regex 正则 = new Regex(@"<\s*(?<标签名>\w+)[^>]*>");
        Match 匹配 = 正则.Match(字符串);
        int 初始位置;
        int 指针_头 = 0;
        int 指针_尾 = 0;
        int 指针_初始之后 = 0;
        string 标签名;
        Regex 正则_标签头;
        Regex 正则_标签尾;
        bool 匹配成功 = 匹配.Success;
        if (匹配.Success == false) return html标签;

        初始位置 = 匹配.Index;
        标签名 = 匹配.Groups["标签名"].Value;
        正则_标签头 = new Regex(@"<\s*" + 标签名 + @"[^>]*>");
        正则_标签尾 = new Regex(@"<\s*/\s*" + 标签名 + @"\s*>");

        while (true)
        {
            匹配 = 正则_标签头.Match(字符串, 初始位置);  //先找头
            if (匹配.Success == false) break;
            //找到头的话,运行下面语句
            int 计数 = 1;
            初始位置 = 匹配.Index;
            指针_头 = 初始位置 + 匹配.Length;
            指针_尾 = 指针_头;
            指针_初始之后 = 初始位置 + 匹配.Length;
            while (true)   //循环找尾
            {
                匹配 = 正则_标签尾.Match(字符串, 指针_尾);  //后找尾
                if (匹配.Success == false) break;//标签尾匹配失败,跳出循环
                //找到尾的话,运行下面语句
                计数--;
                指针_尾 = 匹配.Index + 匹配.Length;
                while (true)  //在头和尾之间循环找头
                {
                    匹配 = 正则_标签头.Match(字符串, 指针_头, 指针_尾 - 指针_头);  //在头和尾之前寻找头
                    if (匹配.Success == false) break; //找不到头,跳出
                    指针_头 = 匹配.Index + 匹配.Length;
                    计数++;
                }
                指针_头 = 指针_尾;//全部查找完毕,将标签头的指针移到标签尾部
                if (计数 == 0) break;//计数为0,匹配成功
            } //尾成功的话,继续匹配(计数不为0)
            if (计数 == 0) //如果计数=0证明是一个完整的配对标签,所以初始位置是指针_尾
            {
                html标签.Add(字符串.Substring(初始位置, 指针_尾 - 初始位置));
                初始位置 = 指针_尾;
            }
            else ///找不到尾,计数不为0,将初始位置移到初始位置之后偏移一个标签头的长度,
            {
                初始位置 = 指针_初始之后;
            }
        }
        for (int i = 0; i < html标签.Count; i++)
        {
            Console.WriteLine("{0}:{1}", i, html标签[i]);
        }
        return html标签;
    }//函数


 

猜你喜欢

转载自blog.csdn.net/qq_33534723/article/details/78934229