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标签; }//函数