• 主页
  • ASP
  • .NET Framework
  • Web Services
  • VB
  • VC
  • 图表区
  • 分析与设计
  • 组件/控件开发
  • LINQ

用正则取数据。

vicqqq 2009-07-22 09:22:40
一个字符串有很多个这样的table
<table style="border-bottom: steelblue thin solid; background-color: #f0f8ff" class="text" width="920">
<tbody><tr>
<td style="width: 2%" class="td3">
<a id="ctl00_cph1_GdvResult_ctl05_linkExapnd" href="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$cph1$GdvResult$ctl05$linkExapnd", "", true, "", "", false, true))">+</a></td>
<td style="width: 2%" class="td3">
<input type="image" name="ctl00$cph1$GdvResult$ctl05$imbShow" id="ctl00_cph1_GdvResult_ctl05_imbShow" title="View Detail" src="../Images/edit-record-icon.gif" onclick="javascript:window.open('PopupDiamondDetail.aspx?Pno=72711301&Id=2312','mywin');return false;WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$cph1$GdvResult$ctl05$imbShow", "", true, "", "", false, false))" border="0" /></td>
<td style="width: 2%" class="td3">
<input id="ctl00_cph1_GdvResult_ctl05_c" type="checkbox" name="ctl00$cph1$GdvResult$ctl05$c" /></td>
<td style="width: 1%" class="td3">
<a href='../bwcopy/72711301.jpg' target="_blank">
<img src="../forweb/RBC.gif" title="View B&W Copy Of Dimaond" style="border: none" alt="" /></a></td>
<td style="width: 1%" class="td3">
<input type="image" name="ctl00$cph1$GdvResult$ctl05$imbcol" id="ctl00_cph1_GdvResult_ctl05_imbcol" title="View Color Copy Of Diamond" src="../Images/picimgage.gif" onclick="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$cph1$GdvResult$ctl05$imbcol", "", true, "", "", false, false))" border="0" /></td>
<td style="width: 10%" class='td3'>72711301</td>
<td style="width: 6%" class='td3'>hhh</td>
<td id="ctl00_cph1_GdvResult_ctl05_Dwt" style="width: 5%" class="td3">0.70</td>
<td style="width: 8.5%" class='td3'>J</td>
<td style="width: 5%" class='td3'>SI2</td>
</tr></tbody></table>
我想找出红色字那些数据
用正则怎么去匹配,或者有没有其他方法
...全文
544 点赞 收藏 62
写回复
62 条回复
Ray1010 2009年07月23日
注意力完全被楼主的头像吸引过去了
回复 点赞
luckyLHY 2009年07月23日
VB2005
思路:先按判断条件找到包含有所要要的字符串的母字符串,然后从母字符串中提取要找的数据
最近研究一下正则表达式,下面的代码可以把楼主当前数据找出。至于其他的页面结构如不变,一样通用。
如有疑问,可互相讨论。
附 相当好的正则教程:http://dragon.cnblogs.com/archive/2006/05/08/394078.html

Dim mystr As String '要找的子字符串所在母字符串
Dim pattern As String '判断母字符串的正则表达式
Dim myreader As StreamReader = File.OpenText("C:\Documents and Settings\USER\Desktop\Public\新增文字文件.txt") '打开文件
pattern = "<td .+?class=.+?td[0-9]+?.+?>.+?</td>"
'pattern = "<tb .+?class=.+?tb[0-9]+?.+?>.+?</tb>"
mystr = myreader.ReadLine '读取文件第一行字符串,指针下移
While (mystr IsNot Nothing) '字符串未读取完,循环
If Regex.IsMatch(mystr, pattern) Then '判断母字符串是否包含所要找的子字符串
Dim sonstr As String '子字符串
sonstr = Regex.Match(mystr, ">.+?<").Value '子字符串在母字符串 >< 中
sonstr = sonstr.Replace(">", "").Replace("<", "") '把 >< 去掉得到的字符串就是所要找的数据
MsgBox(sonstr)
End If
mystr = myreader.ReadLine '读取文件当前行字符串,指针下移
End While

回复 点赞
-过客- 2009年07月23日
另外需要说明的一点是,我写的代码里,把<td...>和</td>之间,去掉html标签后为空的内容过滤掉了,如果不想过滤
Regex regTD = new Regex(@"(?is)(?<=<td[^>]*>)(?!\s*</td)(?:(?!</td\b).)*(?=</td>)", RegexOptions.Compiled);
Regex regRe = new Regex(@"<[^>]*>|\s+", RegexOptions.Compiled);
//替换为
Regex regTD = new Regex(@"(?is)(?<=<td[^>]*>)(?:(?!</td\b).)*(?=</td>)", RegexOptions.Compiled); //去掉html标签为空白字符串不过滤
Regex regRe = new Regex(@"<[^>]*>", RegexOptions.Compiled); //只去掉html标签,不过滤空白字符
回复 点赞
paual779 2009年07月23日
可以再网上找找关于筛选html标签,只取文本的相关文章。

/// <summary>
/// 按字节长度截取字符串(支持截取带HTML代码样式的字符串)
/// </summary>
/// <param name="param">将要截取的字符串参数</param>
/// <param name="length">截取的字节长度</param>
/// <param name="end">字符串末尾补上的字符串</param>
/// <returns></returns>
public static string subStringHTML(string param, int length)
{
string Pattern = null;
MatchCollection m = null;
StringBuilder result = new StringBuilder();
int n = 0;
char temp;
bool isCode = false; //是不是HTML代码
bool isHTML = false; //是不是HTML特殊字符,如 
char[] pchar = param.ToCharArray();
for (int i = 0; i < pchar.Length; i++)
{
temp = pchar[i];
if (temp == '<')
{
isCode = true;
}
else if (temp == '&')
{
isHTML = true;
}
else if (temp == '>' && isCode)
{
n = n - 1;
isCode = false;
}
else if (temp == ';' && isHTML)
{
isHTML = false;
}

if (!isCode && !isHTML)
{
n = n + 1;
//UNICODE码字符占两个字节
if (System.Text.Encoding.Default.GetBytes(temp + "").Length > 1)
{
n = n + 1;
}
}

result.Append(temp);
if (n >= length)
{
break;
}
}
result.Append("...");
//取出截取字符串中的HTML标记
string temp_result = result.ToString().Replace("(>)[^<>]*(<?)", "$1$2");
//去掉不需要结素标记的HTML标记
temp_result = temp_result.Replace(@"< (AREA|BASE|BASEFONT|BODY|BR|COL|COLGROUP|DD|DT|FRAME|HEAD|HR|HTML|IMG|INPUT|ISINDEX|LI|LINK|META|OPTION|P|PARAM|TBODY|TD|TFOOT|TH|THEAD|TR|area|base|basefont|body|br|col|colgroup|dd|dt|frame|head|hr|html|img|input|isindex|li|link|meta|option|p|param|tbody|td|tfoot|th|thead|tr)[^<>]* >", "");
//去掉成对的HTML标记
temp_result = temp_result.Replace(@"<([a-zA-Z]+)[^<>]*>(.*?)</\1>", "$2");
//用正则表达式取出标记
Pattern = ("<([a-zA-Z]+)[^<>]*>");
m = Regex.Matches(temp_result, Pattern);

ArrayList endHTML = new ArrayList();

foreach (Match mt in m)
{
endHTML.Add(mt.Result("$1"));
}
//补全不成对的HTML标记
for (int i = endHTML.Count - 1; i >= 0; i--)
{
result.Append("</");
result.Append(endHTML[i]);
result.Append(">");
}

return result.ToString();
}
回复 点赞
编程有钱人了 2009年07月23日
LOOK
回复 点赞
vicqqq 2009年07月22日
终于好了~~
非常感谢过客老大。。。
结贴睡觉。。
回复 点赞
-过客- 2009年07月22日
<td style="width: 2%" title='Diamond On Memo'
class='mt'>
M
</td>

这个是“mt”。。。

Regex regTR = new Regex(@"(?is)<tr>\s*(?:<td(?:(?!class=).)*class=([""']?)(?:td\d*|mtt?\d*)\1>(?:(?!</td>).)*</td>\s*){5}(?<content>(?:<td(?:(?!class=).)*class=([""']?)(?:td\d*|mtt?\d*)\2>(?:(?!</td>).)*</td>\s*)+)</tr>", RegexOptions.Compiled);
Regex regTD = new Regex(@"(?is)(?<=<td[^>]*>)(?!\s*</td)(?:(?!</td\b).)*(?=</td>)", RegexOptions.Compiled);
Regex regRe = new Regex(@"<[^>]*>|\s+", RegexOptions.Compiled);
MatchCollection mcTR = regTR.Matches(yourStr);
foreach (Match mTR in mcTR)
{
MatchCollection mcTD = regTD.Matches(mTR.Groups["content"].Value);
foreach (Match mTD in mcTD)
{
richTextBox2.Text += regRe.Replace(mTD.Value, "") + "\n";
}
richTextBox2.Text += "\n------------------------------\n";
}
回复 点赞
vicqqq 2009年07月22日
<table style="border-bottom: steelblue thin solid; background-color: #f0f8ff" class="text"
width="920">
<tbody>
<tr>
<td style="width: 2%" class="td3">
<a id="ctl00_cph1_GdvResult_ctl07_linkExapnd" href="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$cph1$GdvResult$ctl07$linkExapnd", "", true, "", "", false, true))">+</a></td>
<td style="width: 2%" class="td3">
<input type="image" name="ctl00$cph1$GdvResult$ctl07$imbShow" id="ctl00_cph1_GdvResult_ctl07_imbShow" title="View Detail" src="../Images/edit-record-icon.gif" onclick="javascript:window.open('PopupDiamondDetail.aspx?Pno=71400701&Id=2640','mywin');return false;WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$cph1$GdvResult$ctl07$imbShow", "", true, "", "", false, false))" border="0" /></td>
<td style="width: 2%" class="td3">
<input id="ctl00_cph1_GdvResult_ctl07_c" type="checkbox" name="ctl00$cph1$GdvResult$ctl07$c" /></td>
<td style="width: 1%" class="td3">
<a href='../bwcopy/71400701.jpg' target="_blank">
<img src="../forweb/RBC.gif" title="View B&W Copy Of Dimaond" style="border: none"
alt="" /></a></td>
<td style="width: 1%" class="td3">
<input type="image" name="ctl00$cph1$GdvResult$ctl07$imbcol" id="ctl00_cph1_GdvResult_ctl07_imbcol" title="View Color Copy Of Diamond" src="../Images/picimgage.gif" onclick="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$cph1$GdvResult$ctl07$imbcol", "", true, "", "", false, false))" border="0" /></td>
<td style="width: 10%" class='mtt'>
71400701
</td>
<td style="width: 6%" class='mtt'>
RBC
</td>
<td id="ctl00_cph1_GdvResult_ctl07_Dwt" style="width: 5%" class="mtt">
0.70
</td>

<td style="width: 8.5%" class='mtt'>
H
</td>
<td style="width: 5%" class='mtt'>
SI1
</td>
<td style="width: 4%" class='mtt'>
VG
</td>
<td id="ctl00_cph1_GdvResult_ctl07_Dprice" style="width: 8%" class="mtt">
1764.00
</td>

<td id="ctl00_cph1_GdvResult_ctl07_Dback" style="width: 6.5%" class="mtt">
-48.12
</td>

<td style="width: 4%" class='mtt'>
<a onclick="javascript:window.open('../Certificate/71400701.jpg');return false;" id="ctl00_cph1_GdvResult_ctl07_linrLab" class="cyanlink" href="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$cph1$GdvResult$ctl07$linrLab", "", true, "", "", false, true))">IGI</a></td>
<td style="width: 4%" class='mtt'>
EX
</td>
<td style="width: 4%" class='mtt'>
VG
</td>
<td style="width: 4%" class='mtt'>
N
</td>
<td style="width: 6%" class='mtt'>
62.20
%
</td>
<td style="width: 6%" class='mtt'>
56
%
</td>
<td style="width: 10%" class='mtt'>
5.66
x5.69x3.53
</td>
<td style="width: 2%" title='Diamond On Memo'
class='mt'>
M
</td>
<td style="width: 0.25%" class="td3">
<input type="hidden" name="ctl00$cph1$GdvResult$ctl07$I" id="ctl00_cph1_GdvResult_ctl07_I" value="2640" />
</td>
<td style="width: 0.25%" class="td3">
<input type="hidden" name="ctl00$cph1$GdvResult$ctl07$P" id="ctl00_cph1_GdvResult_ctl07_P" value="71400701" />
</td>
</tr>
</tbody>
</table>

这样。
回复 点赞
-过客- 2009年07月22日
53楼内容不全,要像49楼那样,从<table到</table>的源字符串,才能看出问题所在
回复 点赞
vicqqq 2009年07月22日
<td style="width: 10%" class='mtt'>
71400701
</td>
<td style="width: 6%" class='mtt'>
RBC
</td>
<td id="ctl00_cph1_GdvResult_ctl07_Dwt" style="width: 5%" class="mtt">
0.70
</td>

<td style="width: 8.5%" class='mtt'>
H
</td>
<td style="width: 5%" class='mtt'>
SI1
</td>
<td style="width: 4%" class='mtt'>
VG
</td>
<td id="ctl00_cph1_GdvResult_ctl07_Dprice" style="width: 8%" class="mtt">
1764.00
</td>

<td id="ctl00_cph1_GdvResult_ctl07_Dback" style="width: 6.5%" class="mtt">
-48.12
</td>

<td style="width: 4%" class='mtt'>
<a onclick="javascript:window.open('../Certificate/71400701.jpg');return false;" id="ctl00_cph1_GdvResult_ctl07_linrLab" class="cyanlink" href="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$cph1$GdvResult$ctl07$linrLab", "", true, "", "", false, true))">IGI</a></td>
<td style="width: 4%" class='mtt'>
EX
</td>
<td style="width: 4%" class='mtt'>
VG
</td>
<td style="width: 4%" class='mtt'>
N
</td>
<td style="width: 6%" class='mtt'>
62.20
%
</td>
<td style="width: 6%" class='mtt'>
56
%
</td>
<td style="width: 10%" class='mtt'>
5.66
x5.69x3.53
</td>

单独有个是这样子的。。。都带mtt
回复 点赞
-过客- 2009年07月22日
[Quote=引用 51 楼 vicqqq 的回复:]
可以了,20个取了19个
[/Quote]

介个,还有一个是什么样的?
回复 点赞
vicqqq 2009年07月22日
可以了,20个取了19个
回复 点赞
-过客- 2009年07月22日
48楼的应该可以满足你49楼的要求,测下看还有没有不满足的
回复 点赞
vicqqq 2009年07月22日
<table style="border-bottom: steelblue thin solid; background-color: #f0f8ff" class="text"  width="920"><tbody>
<tr>
<td style="width: 2%" class="td3">
<a id="ctl00_cph1_GdvResult_ctl03_linkExapnd" href="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$cph1$GdvResult$ctl03$linkExapnd", "", true, "", "", false, true))">+</a></td>
<td style="width: 2%" class="td3">
<input type="image" name="ctl00$cph1$GdvResult$ctl03$imbShow" id="ctl00_cph1_GdvResult_ctl03_imbShow" title="View Detail" src="../Images/edit-record-icon.gif" onclick="javascript:window.open('PopupDiamondDetail.aspx?Pno=73405701&Id=2034','mywin');return false;WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$cph1$GdvResult$ctl03$imbShow", "", true, "", "", false, false))" border="0" /></td>
<td style="width: 2%" class="td3">
<input id="ctl00_cph1_GdvResult_ctl03_c" type="checkbox" name="ctl00$cph1$GdvResult$ctl03$c" /></td>
<td style="width: 1%" class="td3">
<a href='../bwcopy/73405701.jpg' target="_blank">
<img src="../forweb/RBC.gif" title="View B&W Copy Of Dimaond" style="border: none"
alt="" /></a></td>
<td style="width: 1%" class="td3">
<input type="image" name="ctl00$cph1$GdvResult$ctl03$imbcol" id="ctl00_cph1_GdvResult_ctl03_imbcol" title="View Color Copy Of Diamond" src="../Images/picimgage.gif" onclick="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$cph1$GdvResult$ctl03$imbcol", "", true, "", "", false, false))" border="0" /></td>
<td style="width: 10%" class='td3'>
73405701
</td>
<td style="width: 6%" class='td3'>
RBC
</td>
<td id="ctl00_cph1_GdvResult_ctl03_Dwt" style="width: 5%" class="td3">
0.71
</td>

<td style="width: 8.5%" class='td3'>
F
</td>
<td style="width: 5%" class='td3'>
SI3
</td>
<td style="width: 4%" class='td3'>
VG
</td>
<td id="ctl00_cph1_GdvResult_ctl03_Dprice" style="width: 8%" class="td3">
1342.00
</td>

<td id="ctl00_cph1_GdvResult_ctl03_Dback" style="width: 6.5%" class="td3">
-56.71
</td>

<td style="width: 4%" class='td3'>
<a id="ctl00_cph1_GdvResult_ctl03_linrLab" class="cyanlink" href="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$cph1$GdvResult$ctl03$linrLab", "", true, "", "", false, true))"><font color="Black">NONE</font></a></td>
<td style="width: 4%" class='td3'>
VG
</td>
<td style="width: 4%" class='td3'>
VG
</td>
<td style="width: 4%" class='td3'>
N
</td>
<td style="width: 6%" class='td3'>
63.70
%
</td>
<td style="width: 6%" class='td3'>
58
%
</td>
<td style="width: 10%" class='td3'>
5.59
x5.62x3.58
</td>
<td style="width: 2%" title='Diamond Available'
class='mtt1'>
A
</td>
<td style="width: 0.25%" class="td3">
<input type="hidden" name="ctl00$cph1$GdvResult$ctl03$I" id="ctl00_cph1_GdvResult_ctl03_I" value="2034" />
</td>
<td style="width: 0.25%" class="td3">
<input type="hidden" name="ctl00$cph1$GdvResult$ctl03$P" id="ctl00_cph1_GdvResult_ctl03_P" value="73405701" />
</td>
</tr>
</tbody>
</table>
回复 点赞
-过客- 2009年07月22日
哦,看了下,有可能是class没取全这个原因,看下这样行不行

Regex regTR = new Regex(@"(?is)<tr>\s*(?:<td(?:(?!class=).)*class=([""']?)(?:td\d*|mtt\d*)\1>(?:(?!</td>).)*</td>\s*){5}(?<content>(?:<td(?:(?!class=).)*class=([""']?)(?:td\d*|mtt\d*)\2>(?:(?!</td>).)*</td>\s*)+)</tr>", RegexOptions.Compiled);
Regex regTD = new Regex(@"(?is)(?<=<td[^>]*>)(?!\s*</td)(?:(?!</td\b).)*(?=</td>)", RegexOptions.Compiled);
Regex regRe = new Regex(@"<[^>]*>|\s+", RegexOptions.Compiled);
MatchCollection mcTR = regTR.Matches(yourStr);
foreach (Match mTR in mcTR)
{
MatchCollection mcTD = regTD.Matches(mTR.Groups["content"].Value);
foreach (Match mTD in mcTD)
{
richTextBox2.Text += regRe.Replace(mTD.Value, "") + "\n";
}
richTextBox2.Text += "\n------------------------------\n";
}
回复 点赞
-过客- 2009年07月22日
[Quote=引用 46 楼 vicqqq 的回复:]
漏了点没说清楚
间隔的table颜色不一样,你那个是隔一个取
<table style="border-bottom: steelblue thin solid; background-color: #e3eaeb" class="text"

<table style="border-bottom: steelblue thin solid; background-color: #f0f8ff" class="text"
[/Quote]

我的代码里根本就没涉及到table,给个不能匹配的table的例子看下
回复 点赞
vicqqq 2009年07月22日
漏了点没说清楚
间隔的table颜色不一样,你那个是隔一个取
<table style="border-bottom: steelblue thin solid; background-color: #e3eaeb" class="text"

<table style="border-bottom: steelblue thin solid; background-color: #f0f8ff" class="text"
回复 点赞
-过客- 2009年07月22日
[Quote=引用 42 楼 vicqqq 的回复:]
这东西是人写的吗。。。比机器码还难
[/Quote]

回复 点赞
-过客- 2009年07月22日
我这里用了
class=([""']?)(?:td|mtt1)\1
做为td的标识,看下取不出的10个是不是在这之外的,有什么规律

如果不能从这里下手的话,那就只能用平衡组先取table了
回复 点赞
vicqqq 2009年07月22日
这东西是人写的吗。。。比机器码还难
回复 点赞
发动态
发帖子
.NET技术社区
创建于2007-09-28

4.9w+

社区成员

66.8w+

社区内容

.NET技术交流专区
社区公告
暂无公告