using System;
using System.Collections;
using System.Text.RegularExpressions;
public class MyClass
{
public static void Main()
{
string msg = null;
string str = null;
str += "<table width=\"100%\" align=\"center\" border=\"0\">";
str += "<tr>";
str += "<td width=\"777\" valign=\"top\">";
str += "第1行.<msii id = \"H.Menu\" value = \"page:local\" style=\"classics:103\"></msii>";
str += "第2行.<msii id = \"V.Menu\" value = \"news:local\" style=\"classics:166\"/>";
str += "第3行.<msii id = \"T.Item\" value = \"news:local\" style=\"classics:134\"/>";
str += "第4行.<msii id = \"S.List\" value = \"page:local\" style=\"classics:332\"></msii>";
str += "第5行.<msii id="Icon.Menu" value="news:001" style="left:129"><img src="../image/ccc.gif"></msii>";
str += "第6行.<msii id="Icon.Menu" value="news:02x" style="left:129">这是一条测试信息</msii>";
str += "</td>";
str += "</tr>";
str += "</table>";//以下取得html文本中存在多少个msii标签对
string regexString = @"(<msii[^>]*/>)|(<msii[^>]*>.*?</msii>)";
Regex matchesRegex = new Regex(regexString); 
MatchCollection matchFound = matchesRegex.Matches(ReturnText); 
if(matchFound.Count>0)
{
//以下正则表达式只是将每一个msii标签对中的数据分离出来如:id=……、value=……、style=……,但是如果将<msii></msii>标签对之间的(非空格)数据也取出来成为独立的数据应该怎么表达式?即是指<msii></msii>标签对之间可能是空格,也可能是文本或图片地址(如:<img src="../image/ccc.gif">将视为一个整体)。如果是空格则当作无空格处理。
//…………………………………………………………………………………………
//下面如何将取得的这些标签对中的数据分离出来?其实就是解决如何写这个正则表达式?
RegExPattern = @"(\S*?)\s*?=\s*?""(.*?)""";
for(int i=0;i<matchFound.Count;i++)
{
//Response.Write(matchFound[i].ToString().Trim());//显示html文本中的标签对。
Regex reg = new Regex(RegExPattern, RegexOptions.IgnoreCase);
MatchCollection ms = reg.Matches(matchFound[i].ToString().Trim());
if(ms.Count > 0)
{
foreach(Match m in ms)
{
Response.Write(m.Groups[0].Value);//得到分离后的数值
Response.Write(m.Groups[1].Value);//得到分离后的数值
Response.Write(m.Groups[2].Value);//得到分离后的数值
Response.Write(m.Groups[3].Value);//得到分离后的数值,可能为空。因为位于<msii>……</msii>之间。
}
}
}
//…………………………………………………………………………………………
}
}
}//在这里实现:
//1.将msii标签里的数据分离出来,分别表达成独立的数据。
//如将:<msii id = \"V.Menu\" value = \"news:local\" style=\"classics:166\"/>分离后得到三个部分:V.Menu;news:local;classics:166。
//2.若<msii ……>……</msii>标签中有数值(非空格数据)的,则将标签之间的也分离出来成为独立的数据。
//如将第五行<msii id="Icon.Menu" value="news:001" style="left:129"><img src="../image/ccc.gif"></msii>分离得到四个部分:Icon.Menu;news:001;left:129;<img src="../image/ccc.gif">
//而将第六行<msii id="Icon.Menu" value="news:02x" style="left:129">这是一条测试信息</msii>分离得到四个部分:Icon.Menu;news:001;left:129;这是一条测试信息
//<a href="news:02x">这是一条测试信息</a>//3.msii标签说明:
//(1)msii标签支持三种形式:<msii … />、<msii …></msii>和<msii ……>……</msii>
//(2)msii标签内的参数值的表现形式可能是:
//     id = …、id = '…'、id="…"(=号两边可能有空格);
//     value = "…"、value = '…'或value = …(=号两边可能有空格);
//     style = "…"、style = '…'或style = …(=号两边可能有空格);
//……
Console.WriteLine(msg);//打印结果
}
}

解决方案 »

  1.   

    using System;
    using System.Collections;
    using System.Text.RegularExpressions;
    public class MyClass
    {
    public static void Main()
    {
    string msg = null;
    string str = null;
    str += "<table width=\"100%\" align=\"center\" border=\"0\">";
    str += "<tr>";
    str += "<td width=\"777\" valign=\"top\">";
    str += "第1行.<msii id = \"H.Menu\" value = \"page:local\" style=\"classics:103\"></msii>";
    str += "第2行.<msii id = \"V.Menu\" value = \"news:local\" style=\"classics:166\"/>";
    str += "第3行.<msii id = \"T.Item\" value = \"news:local\" style=\"classics:134\"/>";
    str += "第4行.<msii id = \"S.List\" value = \"page:local\" style=\"classics:332\"></msii>";
    str += "第5行.<msii id="Icon.Menu" value="news:001" style="left:129"><img src="../image/ccc.gif"></msii>";
    str += "第6行.<msii id="Icon.Menu" value="news:02x" style="left:129">这是一条测试信息</msii>";
    str += "</td>";
    str += "</tr>";
    str += "</table>";//以下取得html文本中存在多少个msii标签对
    string regexString = @"(<msii[^>]*/>)|(<msii[^>]*>.*?</msii>)";
    Regex matchesRegex = new Regex(regexString); 
    MatchCollection matchFound = matchesRegex.Matches(ReturnText); 
    if(matchFound.Count>0)
    {
    //以下正则表达式只是将每一个msii标签对中的数据分离出来如:id=……、value=……、style=……,但是如果将<msii></msii>标签对之间的(非空格)数据也取出来成为独立的数据应该怎么表达式?即是指<msii></msii>标签对之间可能是空格,也可能是文本或图片地址(如:<img src="../image/ccc.gif">将视为一个整体)。如果是空格则当作无空格处理。
    //…………………………………………………………………………………………
    //下面如何将取得的这些标签对中的数据分离出来?其实就是解决如何写这个正则表达式?
    RegExPattern = @"(\S*?)\s*?=\s*?""(.*?)""";
    for(int i=0;i<matchFound.Count;i++)
    {
    //Response.Write(matchFound[i].ToString().Trim());//显示html文本中的标签对。
    Regex reg = new Regex(RegExPattern, RegexOptions.IgnoreCase);
    MatchCollection ms = reg.Matches(matchFound[i].ToString().Trim());
    if(ms.Count > 0)
    {
    foreach(Match m in ms)
    {
    Response.Write(m.Groups[0].Value);//得到分离后的数值
    Response.Write(m.Groups[1].Value);//得到分离后的数值
    Response.Write(m.Groups[2].Value);//得到分离后的数值
    Response.Write(m.Groups[3].Value);//得到分离后的数值,可能为空。因为位于<msii>……</msii>之间。
    }
    }
    }
    //…………………………………………………………………………………………
    }
    }
    }//在这里实现:
    //1.将msii标签里的数据分离出来,分别表达成独立的数据。
    //如将:<msii id = \"V.Menu\" value = \"news:local\" style=\"classics:166\"/>分离后得到三个部分:V.Menu;news:local;classics:166。
    //2.若<msii ……>……</msii>标签中有数值(非空格数据)的,则将标签之间的也分离出来成为独立的数据。
    //如将第五行<msii id="Icon.Menu" value="news:001" style="left:129"><img src="../image/ccc.gif"></msii>分离得到四个部分:Icon.Menu;news:001;left:129;<img src="../image/ccc.gif">
    //而将第六行<msii id="Icon.Menu" value="news:02x" style="left:129">这是一条测试信息</msii>分离得到四个部分:Icon.Menu;news:001;left:129;这是一条测试信息//3.msii标签说明:
    //(1)msii标签支持三种形式:<msii … />、<msii …></msii>和<msii ……>……</msii>
    //(2)msii标签内的参数值的表现形式可能是:
    //     id = …、id = '…'、id="…"(=号两边可能有空格);
    //     value = "…"、value = '…'或value = …(=号两边可能有空格);
    //     style = "…"、style = '…'或style = …(=号两边可能有空格);
    //……
    Console.WriteLine(msg);//打印结果
    }
    }
      

  2.   

    using System;
    using System.Text.RegularExpressions;
    using System.Collections;public class MyClass
    {
    public static void Main()
    {
            string str = @"<table width=""100%"" align=""center"" border=""0"">
    <tr>
    <td width=""777"" valign=""top"">
    第1行.<msii id = ""H.Menu"" value = ""page:local"" style=""classics:103""></msii>
    第2行.<msii id = ""V.Menu"" value = ""news:local"" style=""classics:166""/>
    第3行.<msii id = ""T.Item"" value = ""news:local"" style=""classics:134""/>
    第4行.<msii id = ""S.List"" value = ""page:local"" style=""classics:332""></msii>
    第5行.<msii id=""Icon.Menu"" value=""news:001"" style=""left:129""><img src=""../image/ccc.gif""></msii>
    第6行.<msii id=""Icon.Menu"" value=""news:02x"" style=""left:129"">这是一条测试信息</msii>
    </td>
    </tr>
        </table>";
        string regexStr = "<msii\\s+id\\s*=\\s*\\\"(?<id>[^\\\"]+)\\\"\\s+value\\s*=\\s*\\\"(?<value>[^\\\"]+)\\\"\\s+style\\s*=\\s*\\\"(?<style>[^\\\"]+)\\\"((/>)|>((?<content>.*?)</msii>))";
        MatchCollection mc = Regex.Matches(str, regexStr);
        foreach(Match m in mc)
        {
            Console.WriteLine(m.Groups["id"].Value);
            Console.WriteLine(m.Groups["value"].Value);
            Console.WriteLine(m.Groups["style"].Value);
            Console.WriteLine(m.Groups["content"].Value);
            Console.WriteLine("\r\n");
        }
                Console.ReadLine();
    }
    }
      

  3.   

    http://www.codeplex.com/Wiki/View.aspx?ProjectName=htmlagilitypackFor example, here is how you would fix all hrefs in an HTML file:HtmlDocument doc = new HtmlDocument();
    doc.Load("file.htm");
    foreach(HtmlNode link in doc.DocumentElement.SelectNodes("//a@href")
    {
    HtmlAttribute att = link"href";
    att.Value = FixLink(att);
    }
    doc.Save("file.htm");
      

  4.   

    测试数据
    第1行.<msii id = "H.Menu" value = "page:local" style="classics:103"></msii>
    第2行.<msii id = "V.Menu" value = "news:local" style="classics:166"/>
    第3行.<msii id = "T.Item" value = "news:local" style       =                 'classics:134'/>
    第4行.<msii id = "S.List" value = "page:local" style="classics:332"></msii>
    第5行.<msii id="Icon.Menu" value="news:001"" style="left:129"><img src="../image/ccc.gif"></msii>
    第6行.<msii id="Icon.Menu" value='news:02x' style="left:129">这是一条测试信息</msii>
    正则
    <\s*msii.*?id\s*=\s*(["'])(?<ID值>.*?)\1.*?value\s*=\s*(["'])(?<value值>.*?)\2.*?style\s*=\s*(["'])(?<style值>.*?)\3.*?(?:/>|(?:>(?<一对msii标签中间的值>.*?)<\s*/msii\s*>))
    结果:
    捕获 1 :
        <msii id = "H.Menu" value = "page:local" style="classics:103"></msii>
    ==============================华丽的分隔线===============================
    捕获 2 :
        <msii id = "V.Menu" value = "news:local" style="classics:166"/>
    ==============================华丽的分隔线===============================
    捕获 3 :
        <msii id = "T.Item" value = "news:local" style       =                 'classics:134'/>
    ==============================华丽的分隔线===============================
    捕获 4 :
        <msii id = "S.List" value = "page:local" style="classics:332"></msii>
    ==============================华丽的分隔线===============================
    捕获 5 :
        <msii id="Icon.Menu" value="news:001"" style="left:129"><img src="../image/ccc.gif"></msii>
    ==============================华丽的分隔线===============================
    捕获 6 :
        <msii id="Icon.Menu" value='news:02x' style="left:129">这是一条测试信息</msii>
    ==============================华丽的分隔线===============================
    分组结果:
    捕获 1 :
    组 1 :    "
    组 2 :    "
    组 3 :    "
    组 4 :    H.Menu
    组 5 :    page:local
    组 6 :    classics:103
    组 7 :    
    ==============================华丽的分隔线===============================
    捕获 2 :
    组 1 :    "
    组 2 :    "
    组 3 :    "
    组 4 :    V.Menu
    组 5 :    news:local
    组 6 :    classics:166
    组 7 :    
    ==============================华丽的分隔线===============================
    捕获 3 :
    组 1 :    "
    组 2 :    "
    组 3 :    '
    组 4 :    T.Item
    组 5 :    news:local
    组 6 :    classics:134
    组 7 :    
    ==============================华丽的分隔线===============================
    捕获 4 :
    组 1 :    "
    组 2 :    "
    组 3 :    "
    组 4 :    S.List
    组 5 :    page:local
    组 6 :    classics:332
    组 7 :    
    ==============================华丽的分隔线===============================
    捕获 5 :
    组 1 :    "
    组 2 :    "
    组 3 :    "
    组 4 :    Icon.Menu
    组 5 :    news:001
    组 6 :    left:129
    组 7 :    <img src="../image/ccc.gif">
    ==============================华丽的分隔线===============================
    捕获 6 :
    组 1 :    "
    组 2 :    '
    组 3 :    "
    组 4 :    Icon.Menu
    组 5 :    news:02x
    组 6 :    left:129
    组 7 :    这是一条测试信息
    ==============================华丽的分隔线===============================
    组4到组7分别是你想到的值 

    MatchCollection mc = Regex.Matches(str, regexStr);
        foreach(Match m in mc)
        {
            Console.WriteLine(m.Groups["id"].Value);
            Console.WriteLine(m.Groups["value"].Value);
            Console.WriteLine(m.Groups["style"].Value);
            Console.WriteLine(m.Groups["content"].Value);
            Console.WriteLine("\r\n");
        }
    取出便可
      

  5.   

    正则测试页
    http://www.17897.com/regextext.aspx
      

  6.   

    不好意思,之前的正则式有些问题,不会匹配如id='...'和id=的项目
    用下面这个
    string regexStr = "<msii\\s+id\\s*=\\s*(?<s1>[\"']?)(?<id>.+?)\\k<s1>\\s+value\\s*=\\s*(?<s2>[\"']?)(?<value>.+?)\\k<s2>\\s+style\\s*=\\s*(?<s3>[\"']?)(?<style>.+?)\\k<s3>\\s*((/>)|>((?<content>.*?)</msii>))";
      

  7.   

    用mobydick提供的那个就可以了
      

  8.   

    因为特殊原因,要把<和>变成[和],我修改了“敌威伯”的正则表达式,怎么就不行了?
    原来是:<msii id = "H.Menu" value = "page:local" style="classics:103"></msii>
    现在是:[msii id = "H.Menu" value = "page:local" style="classics:103"][/msii]RegExPattern = @"\[msii\\s+id\\s*=\\s*(?<s1>[""']?)(?<MsiiID>.+?)\\k<s1>\\s+value\\s*=\\s*(?<s2>[""']?)(?<MsiiValue>.+?)\\k<s2>\\s+style\\s*=\\s*(?<s3>[""']?)(?<MsiiStyle>.+?)\\k<s3>\\s*((/\])|\]((?<MsiiContent>.*?)\[/msii\]))";
      

  9.   

    里面的<   >用\[   \]替换
      

  10.   

    测试数据
    12234234第1行.[msii id = "H.Menu" value = "page:local" style="classics:103"][/msii]
    第2行.[msii id = "V.Menu" value = "news:local" style="classics:166"/]
    第3行.[msii id = "T.Item" value = "news:local" style       =                 'classics:134'/]
    35345
    正则:
    \[\s*msii.*?id\s*=\s*(["'])(?<ID值>.*?)\1.*?value\s*=\s*(["'])(?<value值>.*?)\2.*?style\s*=\s*(["'])(?<style值>.*?)\3.*?(?:/\]|(?:\](?<一对msii标签中间的值>.*?)\[\s*/msii\s*\]))
    结果:
    捕获 1 :
        [msii id = "H.Menu" value = "page:local" style="classics:103"][/msii]==============================华丽的分隔线===============================
    捕获 2 :
        [msii id = "V.Menu" value = "news:local" style="classics:166"/]==============================华丽的分隔线===============================
    捕获 3 :
        [msii id = "T.Item" value = "news:local" style       =                 'classics:134'/]==============================华丽的分隔线===============================
    分组结果:
    捕获 1 :
    组 1 :    "
    组 2 :    "
    组 3 :    "
    组 4 :    H.Menu
    组 5 :    page:local
    组 6 :    classics:103
    组 7 :    
    ==============================华丽的分隔线===============================
    捕获 2 :
    组 1 :    "
    组 2 :    "
    组 3 :    "
    组 4 :    V.Menu
    组 5 :    news:local
    组 6 :    classics:166
    组 7 :    
    ==============================华丽的分隔线===============================
    捕获 3 :
    组 1 :    "
    组 2 :    "
    组 3 :    '
    组 4 :    T.Item
    组 5 :    news:local
    组 6 :    classics:134
    组 7 :    
    ==============================华丽的分隔线===============================
      

  11.   

    regexStr = "\\[msii\\s+id\\s*=\\s*(?<s1>[\"']?)(?<id>.+?)\\k<s1>\\s+value\\s*=\\s*(?<s2>[\"']?)(?<value>.+?)\\k<s2>\\s+style\\s*=\\s*(?<s3>[\"']?)(?<style>.+?)\\k<s3>\\s*((/\\])|\\]((?<content>.*?)\\[/msii\\]))";
      

  12.   

    应该解决了吧?
    你发给我的短消息。===============
    原贴:
    http://community.csdn.net/Expert/topic/5120/5120606.xml?temp=.4792597因为特殊原因,要把<和>变成[和],我修改了“敌威伯”的正则表达式,怎么就不行了?
    原来是:<msii id = "H.Menu" value = "page:local" style="classics:103"></msii>
    现在是:[msii id = "H.Menu" value = "page:local" style="classics:103"][/msii]RegExPattern = @"\[msii\\s+id\\s*=\\s*(?<s1>[""']?)(?<MsiiID>.+?)\\k<s1>\\s+value\\s*=\\s*(?<s2>[""']?)(?<MsiiValue>.+?)\\k<s2>\\s+style\\s*=\\s*(?<s3>[""']?)(?<MsiiStyle>.+?)\\k<s3>\\s*((/\])|\]((?<MsiiContent>.*?)\[/msii\]))";================
    原因是因为你在初始化字符串变量时用了@,去掉@就行了。
    RegExPattern="\[msii\\s+id\\s*=\\s*(?<s1>[""']?)(?<MsiiID>.+?)\\k<s1>\\s+value\\s*=\\s*(?<s2>[""']?)(?<MsiiValue>.+?)\\k<s2>\\s+style\\s*=\\s*(?<s3>[""']?)(?<MsiiStyle>.+?)\\k<s3>\\s*((/\])|\]((?<MsiiContent>.*?)\[/msii\]))";如果用@则所有的\\s替换为\s,\\k替换为\k
    RegExPattern=@"\[msii\s+id\s*=\s*(?<s1>[""']?)(?<MsiiID>.+?)\k<s1>\s+value\s*=\s*(?<s2>[""']?)(?<MsiiValue>.+?)\k<s2>\s+style\s*=\s*(?<s3>[""']?)(?<MsiiStyle>.+?)\k<s3>\s*((/\])|\]((?<MsiiContent>.*?)\[/msii\]))";@的用法请参考
    http://www.chenjiliang.com/Article/View.aspx?ArticleID=207&TypeID=34
      

  13.   

    <(?:msii)[^>]*(?:(id|value|style)(?:\s*=\s*(?:["']?)([^"'\s]*)))[^>]+(?:(id|value|style)(?:\s*=\s*(?:["']?)([^"'\s]*))[^>]+(?:(id|value|style)(?:\s*=\s*(?:["']?)([^"'\s]*))))(?:[^/>]*)(?:/>|>(?<innerhtml>(?:\s+|.)*?)</msii>)以上只需要区分大小写 不需要单行模式 并且无视 id value style 的顺序但不能无视数量
    唉来晚了
    group1 id
    group2 id.value
    group3 value
    group4 value.id
    group5 style
    group6 style.value
    group7 innerhtml
    match FullTag