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>
主要是用于将下面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>
解决方案 »
- 如何引用用户控件中的服务器控件
- 一个关于RequireFieldVilidator的小问题,急!!!!
- xml文件定义了web Form的内容,如何将它呈现在页面呢?
- 请教高手个问题拉,怎么实现页面的打印
- 必须是2000server系统下才能用全文索引?(sql2000里)
- 有个我认为比较复杂但不一定难的问题请教大家,有关数据绑定。
- vs2005中执行 .htc 文件报错,而在 vs2003 就没问题
- 在asp.net上面显示xml的问题
- GridView分页问题
- ado.net 当数据库发生变化时如何更新模型类
- datagrid排序后,如何提交给数据库?
- 完了完了 .NET全忘了~~大家帮帮忙啊
最佳解析为 <td> 'CA','F',2550</td>
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里面的。
onmouseout="hideCabinInfo
这两块是所有span 肯定有的,是固定的
<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>
<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直接取也行但太麻烦,需要很多次的替换。
string result = reg.Replace(yourStr, "<td>${value},${content}</td>");
问一个问题,你是怎么来做像这个这样复杂的正则,虽然我也知道正则的语法,像这种正则,我就没法下手,不知道从哪里开始来做匹配测试,哪里来完善
<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>
<td>'CB','F',2550</td>
应该没问题给下你的代码看看
onmouseover="showCabinInfo(
'KN2275','Y')" onmouseout="hideCabinInfo('KN2275','Y')"> 1700
</span>
上面是我我试着替换换行符也不行
<span
onmouseover="showCabinInfo(
'KN2275','Y')" onmouseout="hideCabinInfo('KN2275','Y')">1700
</span>
这个要比能正确解析的多一个<span CR LF
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>
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>";
如果是单个时'KN2275','Y',1700~
加个~我好用~来分组取数据
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...>中还有属性,需要单独处理一下
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;
[0] "\r\n\t\t\t\t\r\n\t\t\t\tCA5" string
[1] "Y" string
[2] "1700~" string
<span onmouseover=""showCabinInfo(
'CZ3','Y')"" onmouseout=""hideCabinInfo('CZ3','Y')"">
1700
</span>
</td>"; 它得到的结果是这样的
<td>
'CZ3','Y',1700~</td>
照理说应是这样 <td>'CZ3','Y',1700~</td>
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>