请教一个正则匹配表格内容的问题,谢谢!

s777n 2009-04-08 11:48:51
表内容如下:


<tr>
<td><a href="./userInfo.asp?id=1234">name1</a></td>
<td>22岁</td>
<td>77</td>
<td>
<form id="form1" name="form1" action="./doForm.asp" method="post">
<input type="hidden" name="id" value="1234"/>
<a href="javascript:document.form1.submit();" >删除</a>
</form>
</td>
</tr>


<tr>
<td><a href="./userInfo.asp?id=12345">name2</a></td>
<td>24岁</td>
<td>56</td>
<td>
<form id="form1" name="form2" action="./doForm.asp" method="post">
<input type="hidden" name="id" value="12345"/>
<a href="javascript:document.form2.submit();" >删除</a>
</form>
</td>
</tr>

<tr>
<td><a href="./userInfo.asp?id=123">name3</a></td>
<td>21岁</td>
<td>89</td>
<td>
<form id="form1" name="form3" action="./doForm.asp" method="post">
<input type="hidden" name="id" value="1234"/>
<a href="javascript:document.form3.submit();" >删除</a>
</form>
</td>
</tr>




想要提取
第一行 的id 和 name
第二行 的岁数
第三行 的分数

我写的代码如下:


string strRegex = @"<tr[^</tr>]+.*?<td>[^</td>]+.*?id=(?<userID>\d+)"">(?<userName>\.+)</a>.*?</td>.*?<td>[^</td>]+(?<Age>\d+)岁</td>.*?<td>[^</td>]+(?<Points>\d+)</td>.*?</tr>";
MatchCollection mc = Regex.Matches(str, strRegex,RegexOptions.Multiline);
txtBoxUserInfo.Text = mc.Count.ToString();
foreach (Match m in mc)
{
txtBoxUserInfo.Text += m.Groups["userID"].Value + " - " + m.Groups["userName"].Value + " - " + m.Groups["Age"].Value + " - " + m.Groups["Points"].Value + "\r\n";
}


这样匹配不出来,达人们赐教,这样的正则该如何写,才能提取出所要的数据,谢谢!!!
...全文
125 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
路人乙e 2009-04-08
  • 打赏
  • 举报
回复
string reg = @"<tr>[\n ]+<td><a href=""./userinfo.asp?id=(\d+)"">(\w+)</a></td>[\n ]+<td>(\d{2})岁</td>[\n ]+<td>\d{1,3}</td>.+</tr>";

获取 groups[1,2,3]
FireTiger 2009-04-08
  • 打赏
  • 举报
回复
为什么不采用DOM操作呢?那个不也是挺快的么
或者用XPath类的也可以啊,XPathNavigator
yagebu1983 2009-04-08
  • 打赏
  • 举报
回复
你分多次取试试。。。。
LemIST 2009-04-08
  • 打赏
  • 举报
回复
[^<]* 0-n个所有非<字符序列
s777n 2009-04-08
  • 打赏
  • 举报
回复

string strRegex = @"<tr[^<]*.*?<td>.*?id=(\d+)"">(.*?)</a></td>.*?<td>(\d+)岁</td>.*?<td>(\d+)</td>.*?</tr>";
[^<]* 这个是什么意思呢
后来改成<tr[^<>]* 都可以。



s777n 2009-04-08
  • 打赏
  • 举报
回复
再请教个问题。

string strRegex = @"<tr[^<]*.*?<td>.*?id=(\d+)"">(.*?)</a></td>.*?<td>(\d+)岁</td>.*?<td>(\d+)</td>.*?</tr>";
[^<]* 这个是什么意思呢
后来改成<tr[^<>]* 都可以。


稍等,结贴散分
LemIST 2009-04-08
  • 打赏
  • 举报
回复
string text = new StreamReader(@"TextFile1.txt", Encoding.Unicode)
.ReadToEnd().Replace("\r\n", "");
Regex reg =
new Regex("<tr>.*?href=\".*?id=(.*?)\">(.*?)<.*?<td>([0-9]*)岁</td>.*?<td>([0-9]*)</td>.*?</tr>"
, RegexOptions.Compiled | RegexOptions.Multiline);

MatchCollection mtcol = reg.Matches(text);
foreach(Match mat in mtcol)
{
Console.WriteLine("ID:{0}; Name:{1}; Age:{2}; Mark:{3}",
mat.Groups[1].Value,
mat.Groups[2].Value,
mat.Groups[3].Value,
mat.Groups[4].Value);
}
LemIST 2009-04-08
  • 打赏
  • 举报
回复
string text = new StreamReader(@"TextFile1.txt", Encoding.Unicode)
.ReadToEnd().Replace("\r\n", "");
Regex reg =
new Regex("<tr>.*?href=\".*?id=(.*?)\">(.*?)<.*?<td>([0-9]*)岁</td>.*?<td>([0-9]*)</td>.*?</tr>"
, RegexOptions.Compiled | RegexOptions.Multiline);
Match mat = null;int index = 0;
while ((mat = reg.Match(text, index)).Success)
{
Console.WriteLine("ID:{0}; Name:{1}; Age:{2}; Mark:{3}",
mat.Groups[1].Value,
mat.Groups[2].Value,
mat.Groups[3].Value,
mat.Groups[4].Value);
index = mat.Index + mat.Length;
}
s777n 2009-04-08
  • 打赏
  • 举报
回复
终于OK。。。 测了老半天。。。 正则,好烦哪,有空好好看一下基础。。。 谢谢各位参与。。。


string strRegex = @"<tr[^<]*.*?<td>.*?id=(\d+)"">(.*?)</a></td>.*?<td>(\d+)岁</td>.*?<td>(\d+)</td>.*?</tr>";
MatchCollection mc = Regex.Matches(str, strRegex, RegexOptions.Singleline);
s777n 2009-04-08
  • 打赏
  • 举报
回复


string strRegex = @"<tr[^</tr>]+.*?<td>[^</td>]+.*?id=(\d+)"">(.*?)</a></td>.*?<td>(\d+)岁</td>.*?<td>(\d+)</td>.*?<td>.*?</td>.*?</tr>";

MatchCollection mc = Regex.Matches(str, strRegex, RegexOptions.Singleline);
foreach (Match m in mc)
{
txtBoxUserInfo.Text += m.Groups[1].Value + " - " + m.Groups[2].Value + " - " + m.Groups[3].Value + " - " + m.Groups[4].Value + "\r\n";
}


这样倒是能匹配出来,但是只有一条结果



再把 strRegex = "["+strRegex+"]?"; 后能得到很多了,但是莫名其妙的是, 每2条或者N条才能获得一个结果
也就是说,foreach (Match m in mc) 里的每个m.ToString() 不只一个<tr></tr> 可能包含好几行 但不管包含多少行,匹配到一个结果

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧