string result = Regex.Replace(yourStr, @"(?is)<(tr(?=(?:(?!id=|>).)*(\sid=(['""]?)[^'""\s>]+\3))|[a-z]+)\b[^>]*>", "<$1$2>");
主要是用于将下面table进行简化后放到xml,
但现在数据增加了一个<span onmouseover="showCabinInfo('CA','F')" onmouseout="hideCabinInfo('CA','F')">2550</span> 我需在数据能够保存这个 <span> 内容及它的属性,而原有的正则会直接将<span后的方法与属性简化掉
-------------------
<table width="100%" border="0" cellpadding="1" cellspacing="1"
bgcolor="#FFFFFF"><tr bgcolor="#B80000"  id="showItem1">
                <td height="2" colspan="13" id='tdColsTurnUp0' align="center" valign="middle" bgcolor="#B80000"> </td>
            </tr>
            <tr align="left" valign="top" bgcolor="#C9C9C9"  id="showItem2">
<td  bgcolor="#F5F5F5" width="10%" align="center" valign="top" class="zi6" rowspan=9>产品<span onmouseover="showCabinInfo(
'CA','F')" onmouseout="hideCabinInfo('CA','F')">

2550
</span> </td>
             
            </tr>
</table>

解决方案 »

  1.   

    <span onmouseover="showCabinInfo('CA','F')" onmouseout="hideCabinInfo('CA','F')">2550</span> 
    最佳解析为 <td> 'CA','F',2550</td>
      

  2.   

    主要是由于xml对数据要求很严格,如果标签中有属性常常要报错,所以这样。
      

  3.   

    你的'CA','F'是哪个方法的参数?showCabinInfo?hideCabinInfo?
      

  4.   

    你没写错吧?<td>是哪里来的?是<span>?
      

  5.   

    我的想法先把不是span的去掉,正则前面加(?!<span)即可
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Text.RegularExpressions;namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                string yourStr = @"<table width=""100%"" border=""0"" cellpadding=""1"" cellspacing=""1"" 
    bgcolor=""#FFFFFF""> <tr bgcolor=""#B80000""  id=""showItem1""> 
                    <td height=""2"" colspan=""13"" id='tdColsTurnUp0' align=""center"" valign=""middle"" bgcolor=""#B80000""> </td> 
                </tr> 
                <tr align=""left"" valign=""top"" bgcolor=""#C9C9C9""  id=""showItem2""> 
    <td  bgcolor=""#F5F5F5"" width=""10%"" align=""center"" valign=""top"" class=""zi6"" rowspan=9>产品 <span onmouseover=""showCabinInfo( 
    'CA','F')"" onmouseout=""hideCabinInfo('CA','F')""> 2550 
    </span> </td> 
                
                </tr> 
    </table>";            string result = Regex.Replace(yourStr, @"(?is)(?!<span)<(tr(?=(?:(?!id=|>).)*(\sid=(['""]?)[^'""\s>]+\3))|[a-z]+)\b[^>]*>", "<$1$2>");           
                  
                Console.WriteLine(result);
                 }
        }
    }结果是
    <table><tr id="showItem1">
                    <td> </td>
                </tr>
                <tr id="showItem2">
    <td>??<span onmouseover="showCabinInfo(
    'CA','F')" onmouseout="hideCabinInfo('CA','F')">2550
    </span></td>            </tr>
    </table>
    Press any key to continue . . .
    然后在处理span里面的。
      

  6.   

    关键是看不懂楼主的需求,LCL_data的问题楼主还没有回答你的'CA','F'是哪个方法的参数?showCabinInfo?hideCabinInfo?
      

  7.   

    showCabinInfo hideCabinInfo中参数是一至的,所以取哪个都是一样的
      

  8.   

    <span onmouseover="showCabinInfo
    onmouseout="hideCabinInfo
    这两块是所有span 肯定有的,是固定的
      

  9.   

    那么'CA','F'这样的值的个数是不是固定的,如果是固定的,可以一次性取出,如果是不固定的,那就要两次取出了
      

  10.   

    不是结构是这样的
    <table>
    <tr>
      <td> </td>
      <td> </td>
      <td> <span onmouseover="showCabinInfo('CA','F')" onmouseout="hideCabinInfo('CA','F')">2550    </span> </td>  <td> </td>
    </tr>
    <tr>
      <td> </td>
      <td> </td>
      <td> <span onmouseover="showCabinInfo('CB','F')" onmouseout="hideCabinInfo('CB','F')">1550    </span> </td>  <td> </td>
    </tr>
    </table>
      

  11.   

    ==,我这重装系统了,环境有点问题,一会搞定不过不是很明白<td>和</td>,如果<span...>就是出现在<td...>...</td>中的,那么<td>和</td>可以直接取得了,没必要再用正则去源字符串中匹配了
      

  12.   

    <table>
    <tr>
      <td> </td>
      <td> </td>
      <td> 'CA','F',2550    </span> </td>  <td> </td>
    </tr>
    <tr>
      <td> </td>
      <td> </td>
      <td>'CB','F', 1550 </td>  <td> </td>
    </tr>
    </table>
    想做到这样的效果,主要是方便取值,td直接取也行但太麻烦,需要很多次的替换。
      

  13.   

    我现在也能取到td的值,但<span onmouseover="showCabinInfo('CB','F')" onmouseout="hideCabinInfo('CB','F')">1550    </span>  还是要简化为 >>  'CB','F',1550 
      

  14.   

    try...Regex reg = new Regex(@"(?is)<td[^>]*>(?:(?!</?(?:span|td)).)*<span\b(?:(?!onmouseover=).)*onmouseover=""[^""(]*\(\s*(?<value>(?:'[^']*',?)+)\)""[^>]*>\s*(?<content>(?:(?!</?span\b).)*)(?<!\s)\s*</span>\s*</td>");
    string result = reg.Replace(yourStr, "<td>${value},${content}</td>");
      

  15.   

    lxcnn
    问一个问题,你是怎么来做像这个这样复杂的正则,虽然我也知道正则的语法,像这种正则,我就没法下手,不知道从哪里开始来做匹配测试,哪里来完善
      

  16.   

    代码中有个问题
    <td> <span onmouseover="showCabinInfo('CB','F')" onmouseout="hideCabinInfo('CB','F')">1550    </span> </td>
    处理是正确的但下面这种情况会出错,好像中间有换行符之类的
    <td> <span
    onmouseover="showCabinInfo(
    'CB','F')" onmouseout="hideCabinInfo('CB','F')">2550</span></td>
      

  17.   

    在我这里的结果是
    <td>'CB','F',2550</td> 
    应该没问题给下你的代码看看
      

  18.   

     <span
    onmouseover="showCabinInfo(
    'KN2275','Y')" onmouseout="hideCabinInfo('KN2275','Y')"> 1700
    </span>
    上面是我我试着替换换行符也不行
      

  19.   

    我用文本编辑器看了一下
    <span
    onmouseover="showCabinInfo(
    'KN2275','Y')" onmouseout="hideCabinInfo('KN2275','Y')">1700
    </span>
    这个要比能正确解析的多一个<span CR LF  
      

  20.   

    确认一下你的源字符串获取是否正确            string test = @"<td> <span 
    onmouseover=""showCabinInfo( 
    'KN2275','Y')"" onmouseout=""hideCabinInfo('KN2275','Y')""> 
    1700 
    </span> 
     </td>";
                Regex reg = new Regex(@"(?is)<td[^>]*>(?:(?!</?(?:span|td)).)*<span\b(?:(?!onmouseover=).)*onmouseover=""[^""(]*\(\s*(?<value>(?:'[^']*',?)+)\)""[^>]*>\s*(?<content>(?:(?!</?span\b).)*)(?<!\s)\s*</span>\s*</td>");
                string result = reg.Replace(test, "<td>${value},${content}</td>");
                richTextBox2.Text = result;
                //输出
                  <td>'KN2275','Y',1700</td>
      

  21.   

    现在是由于源字符串出现这种情况 @"<td> <span 
    onmouseover=""showCabinInfo( 
    'KN2275','Y')"" onmouseout=""hideCabinInfo('KN2275','Y')""> 
    1700 
    </span> 
    <span 
    onmouseover=""showCabinInfo( 
    'KN3','Y')"" onmouseout=""hideCabinInfo('KN3','Y')""> 
    1300 
    </span> 
    <span 
    onmouseover=""showCabinInfo( 
    'KN4','Y')"" onmouseout=""hideCabinInfo('KN4','Y')""> 
    1400 
    </span> 
     </td>";
      

  22.   

    看来需要解析成类似这样,我再手工处理   'KN2275','Y',1700~ 'KN3','Y',1300.......
      

  23.   

    给出对应的结果,这样?<td>'KN2275','Y',1700,'KN3','Y',1300,'KN4','Y',1400</td>
      

  24.   

    最好这样<td>'KN2275','Y',1700~'KN3','Y',1300~'KN4','Y',1400</td>
    如果是单个时'KN2275','Y',1700~
    加个~我好用~来分组取数据
      

  25.   

    试下            string test = @" <td> <span 
    onmouseover=""showCabinInfo( 
    'KN2275','Y')"" onmouseout=""hideCabinInfo('KN2275','Y')""> 
    1700 
    </span> 
    <span 
    onmouseover=""showCabinInfo( 
    'KN3','Y')"" onmouseout=""hideCabinInfo('KN3','Y')""> 
    1300 
    </span> 
    <span 
    onmouseover=""showCabinInfo( 
    'KN4','Y')"" onmouseout=""hideCabinInfo('KN4','Y')""> 
    1400 
    </span> 
    </td>"; 
                Regex regSpan = new Regex(@"(?is)(?<=<td[^>]*>[^<]*(<span[^>]*>(?:(?!</?span\b).)*</span>\s*)*)<span(?<values>[^>]*)>\s*(?<content>(?:(?!</?span\b).)*)(?<!\s)\s*</span>\s*(?=(<span[^>]*>(?:(?!</?span\b).)*</span>\s*)*</td>)");
                Regex regValue = new Regex(@"(?<=showCabinInfo\(\s*)('[^']*',?)+(?=\))");
                string result = regSpan.Replace(test, delegate(Match m) { return regValue.Match(m.Groups["values"].Value).Value + "," + m.Groups["content"].Value + "~"; });
                richTextBox2.Text = result;当然,如果<td...>中还有属性,需要单独处理一下
      

  26.   

    delegate 提示无效的表达式,我需要引用什么吗,另这在使用的是.net1.1
      

  27.   

    我这目前没文档,不记得正则匿名委托是.NET哪个版本开始支持的了,这样试下吧        //委托方法
            private string RegReplace(Match m)
            {
                Regex regValue = new Regex(@"(?<=showCabinInfo\(\s*)('[^']*',?)+(?=\))");
                return regValue.Match(m.Groups["values"].Value).Value + "," + m.Groups["content"].Value + "~"; 
            }
            //调用
             Regex regSpan = new Regex(@"(?is)(?<=<td[^>]*>[^<]*(<span[^>]*>(?:(?!</?span\b).)*</span>\s*)*)<span(?<values>[^>]*)>\s*(?<content>(?:(?!</?span\b).)*)(?<!\s)\s*</span>\s*(?=(<span[^>]*>(?:(?!</?span\b).)*</span>\s*)*</td>)");
            string result = regSpan.Replace(test, new MatchEvaluator(RegReplace));
            richTextBox2.Text = result;
      

  28.   

    可以使用,但出来的数据很怪前面有这个 \r\n\t\t\t\t\r\n\t\t\t\t 
    [0] "\r\n\t\t\t\t\r\n\t\t\t\tCA5" string
    [1] "Y" string
    [2] "1700~" string
      

  29.   

    htmlxmlstr = @"  <td>
    <span onmouseover=""showCabinInfo(
    'CZ3','Y')"" onmouseout=""hideCabinInfo('CZ3','Y')"">



    1700
    </span>
     </td>"; 它得到的结果是这样的
      <td>
    'CZ3','Y',1700~</td>
    照理说应是这样  <td>'CZ3','Y',1700~</td>
      

  30.   

    哦,\s的位置导致的Regex regSpan = new Regex(@"(?is)(?<=<td[^>]*>[^<]*(\s*<span[^>]*>(?:(?!</?span\b).)*</span>)*)\s*<span(?<values>[^>]*)>\s*(?<content>(?:(?!</?span\b).)*)(?<!\s)\s*</span>\s*(?=(<span[^>]*>(?:(?!</?span\b).)*</span>\s*)*</td>)");
      

  31.   

    如果调整\s对于多<span就会报错无法完全匹配
    htmlxmlstr = @"  <td>
    <span onmouseover=""showCabinInfo(
    'CZ3','Y')"" onmouseout=""hideCabinInfo('CZ3','Y')"">



    1700
    </span>
                       <span onmouseover=""showCabinInfo(
    'CZ5','Y')"" onmouseout=""hideCabinInfo('CZ5','Y')"">



    1500
    </span>
     </td>";>>>>>
      <td>'CZ3','Y',1700~<span onmouseover="showCabinInfo(
    'CZ5','Y')" onmouseout="hideCabinInfo('CZ5','Y')">



    1500
    </span>
     </td>
      

  32.   

    不好意思,刚才在公司,不能仔细看,这样再试下Regex regSpan = new Regex(@"(?is)(?<=<td[^>]*>[^<]*(<span[^>]*>(?:(?!</?span\b).)*</span>\s*)*)\s*<span(?<values>[^>]*)>\s*(?<content>(?:(?!</?span\b).)*)(?<!\s)\s*</span>\s*(?=(<span[^>]*>(?:(?!</?span\b).)*</span>\s*)*</td>)");