提取最外層配對標籤,放棄正則表示式-平衡組
阿新 • • 發佈:2019-02-03
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標籤; }//函式