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 += " <msii id = \"H.Menu\" value = \"page:local\" style=\"classics:103\"></msii>";
str += " <msii id = \"V.Menu\" value = \"news:local\" style=\"classics:166\"/>";
str += " <msii id = \"T.Item\" value = \"news:local\" style=\"classics:134\"/>";
str += " <msii id = \"S.List\" value = \"page:local\" style=\"classics:332\"></msii>";
str += " </td>";
str += " </tr>";
str += "</table>";
string regexString=@"(\S*?)\s*?=\s*?""(.*?)""";
//在这里实现:
//1.将msii标签里的数据分离出来,分别表达成独立的数据。
//如将:<msii id = \"V.Menu\" value = \"news:local\" style=\"classics:166\"/>分离后得到:V.Menu;news:local;classics:166。
//2.将msii标签替换成相应标签里的数值。
//如将:<msii id = \"H.Menu\" value = \"page:local\" style=\"classics:103\"></msii>替换成:H.Menu - page:local - classics:103
//3.msii标签说明:
//(1)msii标签支持两种形式:<msii …></msii>和<msii … />
//(2)msii标签内的参数值可能是:value = "…"、value = '…'或value = …;
//……
Console.WriteLine(msg);//打印结果
}
}

解决方案 »

  1.   

    象这个问题用xml来处理明显比正则要好办
    为什么一定要正则?
      

  2.   

    和xml没有任何关系,因为原来的系统要求的就是这样啊。
      

  3.   

    <msii(( \w+) *= *(['|"]?)([a-z\d\:\.]+)\3)+(/>|></msii>)不过分两次来判断可能更好一些
    先找出msii节点
    再取值
      

  4.   

    如果ID/Value/Style已知都存在并且顺序固定
    也可以一次完成 
    <msii id *= *(['|"]?)([a-z\d\:\.]+)\1 value *= *(['|"]?)([a-z\d\:\.]+)\3 style *= *(['|"]?)([a-z\d\:\.]+)\5(/>|></msii>)
      

  5.   

    using System;
    using System.Text;
    using System.Text.RegularExpressions;
    using System.Collections.Generic;public class MyClass
    {
    public static void Main()
    {
    string str = null;
    str += "<table width=\"100%\" align=\"center\" border=\"0\">";
    str += "<tr>";
    str += "<td width=\"777\" valign=\"top\">";
    str += "<msii id = \"H.Menu\" value = \"page:local\" style=\"classics:103\"></msii>";
    str += "<msii id = \"V.Menu\" value = \"news:local\" style=\"classics:166\"/>";
    str += "<msii id = \"T.Item\" value = \"news:local\" style=\"classics:134\"/>";
    str += "<msii id = \"S.List\" value = \"page:local\" style=\"classics:332\"></msii>";
    str += "</td>";
    str += "</tr>";
    str += "</table>";
    Display1(str);
    Display2(str);Console.Read();
    }
    static void Display2(string str){
    Regex reg=new Regex("<msii +id *= *(['|\"]?)([a-z\\d\\:\\.]+)\\1 +value *= *(['|\"]?)([a-z\\d\\:\\.]+)\\3 +style *= *(['|\"]?)([a-z\\d\\:\\.]+)\\5(/>|></msii>)",RegexOptions.IgnoreCase);
    foreach(Match match in reg.Matches(str)){
    Console.WriteLine(match.Groups[0].Value);
    Console.WriteLine("id={0}",match.Groups[2].Value);
    Console.WriteLine("value={0}",match.Groups[4].Value);
    Console.WriteLine("style={0}",match.Groups[6].Value);
    }
    }
    static void Display1(string str){
    Regex reg=new Regex("<msii(( *\\w+) *= *(['|\"]?)([a-z\\d\\:\\.]+)\\3)+(/>|></msii>)",RegexOptions.IgnoreCase);
    foreach(Match match in reg.Matches(str)){
    Console.WriteLine(match.Groups[0].Value);
    Regex reg2=new Regex("( *\\w+) *= *(['|\"]?)([a-z\\d\\:\\.]+)\\2",RegexOptions.IgnoreCase);
    foreach(Match mc in reg2.Matches(match.Groups[0].Value)){
    Console.WriteLine("{0}={1}",mc.Groups[1].Value,mc.Groups[3].Value);
    }

    }
    }
    }
      

  6.   

    测试数据:
    <msii id = "H.Menu" value = "page:local" style="classics:103"></msii>
    <msii id = "V.Menu" value = "news:local" style="classics:166"/>
    正则:<msii id\s*=\s*(["'])(?<id>.*?)\1.*?value\s*=\s*(["'])(?<value>.*?)\2.*?.*?style\s*=\s*(["'])(?<style>.*?)\3.*?(/>|</msii>)
    模式:IgnoreCase, Singleline
    捕获数:2
    捕获 1 :
        <msii id = "H.Menu" value = "page:local" style="classics:103"></msii>
    ==============================华丽的分隔线===============================
    捕获 2 :
        <msii id = "V.Menu" value = "news:local" style="classics:166"/>
    ==============================华丽的分隔线===============================
    捕获 1 :
    组 1 :    "
    组 2 :    "
    组 3 :    "
    组 4 :    </msii>
    组 5 :    H.Menu
    组 6 :    page:local
    组 7 :    classics:103
    ==============================华丽的分隔线===============================
    捕获 2 :
    组 1 :    "
    组 2 :    "
    组 3 :    "
    组 4 :    />
    组 5 :    V.Menu
    组 6 :    news:local
    组 7 :    classics:166
    ==============================华丽的分隔线===============================
      

  7.   

    欢迎访问正则测试页 http://www.17897.com/regextext.aspx
      

  8.   

    测试数据
    <msii id = "H.Menu" value = "page:local" style="classics:103"></msii>
    <msii id = "V.Menu" value = "news:local" style="classics:166"/>
    正则替换旧字符串:
    <msii id\s*=\s*(["'])(?<id>.*?)\1.*?value\s*=\s*(["'])(?<value>.*?)\2.*?.*?style\s*=\s*(["'])(?<style>.*?)\3.*?(/>|</msii>)
    正则替换新字符串:
    $5-$6-$7
    结果:
    H.Menu-page:local-classics:103
    V.Menu-news:local-classics:166
      

  9.   

    朋友曾经过一个工具,处理这种问题正合适,很容易。
    下载地址:http://www.kinghack.com/zzzzzzzzzzz/homepage/ch2sh4/wordbat.htm#有问题可直接联系我:[email protected]
      

  10.   

    先把格式统一成/>结尾的,然后<msii id = \"(\S+)\" value = \"(\S+)\" style=\"(\S+)"/>
      

  11.   

    格式统一成/>结尾的,然后旧字符串 <msii id = \"(\S+)\" value = \"(\S+)\" style=\"(\S+)"/>
    新字符串 $1,$2,$3
      

  12.   

    我错了,没注意到楼主的   3.msii标签说明
      

  13.   

    不能这样做,因为我还要实现下面这样的目的:
    <msii id="icon.menu" value="news:001" style="left:129"><img src="../image/ccc.gif"></msii>
    或:
    <msii id="icon.menu" value="news:001" style="left:129">这是一条测试信息</msii>都将被替换成:
    <a href="news:001"><img src="../image/ccc.gif"></a>
    或:
    <a href="news:001">这是一条测试信息</a>紧急求助一下各位先生兄弟。
      

  14.   

    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++)
    {
    ReturnTextSub = matchFound[i].ToString().Trim();
    }
    }
    }
    }//在这里实现:
    //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);//打印结果
    }
    }