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