1. 程式人生 > >提取最外層配對標籤,放棄正則表示式-平衡組

提取最外層配對標籤,放棄正則表示式-平衡組

 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標籤;
    }//函式