-1

我有一个带有源代码的html页面,如下所示。我的要求是仅在标题为“船舶名称”的列中搜索给定的单词。我想知道哪个正则表达式可以帮助我只提取这个特定列的数据。

我使用了以下两个正则表达式来提取表头和行:

表头 =@"<th[^>]*?>(?<Value>.*?)</th>"通过这个正则表达式我可以找到列 Ship Name

表行=@"<td>(.*?)</td>"通过这个正则表达式,我可以获得每一行的每一列

但我只需要找到每一行的第二列。如果存在任何这样的正则表达式,我可以使用它或任何其他方法来完成我的工作,请提供帮助。请帮我

Html页面源代码为:

<link href="http://www.mhpa.co.uk/reports.css" rel="STYLESHEET" type="text/css" CHARSET="ISO-8859-1">

<table cellpadding=2 cellspacing=0 border=0 width=100%>
<tbody>
<tr>
<td align=right><b>11/09/2013&nbsp;at&nbsp;09:48</b></td>
</tr>
</tbody>
</table>
<center>
<table border="1" bordercolor="silver" cellpadding="2" cellspacing="0" width="100%">
<thead>
<tr>
<th width=100>ETA</th>
<th width=100>Ship Name</th>
<th width=80>From port</th>
<th width=80>To berth</th>
<th width=130>Agent</th>
</tr>
</thead>
<tbody>

<tr><td>11/09/2013 at 09:00&nbsp;</td>
<td>SONANGOL KALANDULA&nbsp;</td>
<td>Cabinda&nbsp;</td>
<td>Valero 6&nbsp;</td>
<td>Graypen&nbsp;</td>
</tr>

<tr>
<td>11/09/2013 at 11:45&nbsp;</td>
<td>ISLE OF INISHMORE&nbsp;</td>
<td>Rosslare&nbsp;</td>
<td>PDFT&nbsp;</td>
<td>Irish Ferries&nbsp;</td>
</tr>

<tr>
<td>11/09/2013 at 12:00&nbsp;</td>
<td>BRO DEVELOPER&nbsp;</td>
<td>Avonmouth&nbsp;</td>
<td>Valero 8&nbsp;</td>
<td>GAC&nbsp;</td>
</tr>

<tr>
<td>11/09/2013 at 14:00&nbsp;</td>
<td>WELSH PIPER&nbsp;</td>
<td>Sea&nbsp;</td>
<td>POP No 1&nbsp;</td>
<td>Tarmac Marine Dredging Ltd&nbsp;</td>
</tr>

<tr>
<td>11/09/2013 at 22:00&nbsp;</td>
<td>PATRICIA&nbsp;</td>
<td>Le Havre&nbsp;</td>
<td>Murco 1&nbsp;</td>
<td>GAC&nbsp;</td>
</tr>

<tr>
<td>12/09/2013 at 05:00&nbsp;</td>
<td>BRO DESIGNER&nbsp;</td>
<td>Plymouth&nbsp;</td>
<td>Murco 2&nbsp;</td>
<td>Graypen&nbsp;</td>
</tr>

<tr>
<td>12/09/2013 at 06:00&nbsp;</td>
<td>BASTOGNE&nbsp;</td>
<td>Mongstad&nbsp;</td>
<td>Valero 3&nbsp;</td>
<td>Denholm Wilhelmsen Ltd&nbsp;</td>
</tr>

<tr>
<td>12/09/2013 at 06:00&nbsp;</td>
<td>MINERVA GRACE&nbsp;</td>
<td>Ras Lanuf&nbsp;</td>
<td>Valero 1&nbsp;</td>
<td>Graypen&nbsp;</td>
</tr>

<tr>
<td>12/09/2013 at 06:00&nbsp;</td>
<td>LEANDER&nbsp;</td>
<td>Dublin &nbsp;</td>
<td>Murco 2&nbsp;</td>
<td>Graypen&nbsp;</td>
</tr>

<tr>
<td>12/09/2013 at 07:00&nbsp;</td>
<td>THUN GLOBE&nbsp;</td>
<td>Cardiff&nbsp;</td>
<td>Valero 7&nbsp;</td>
<td>GAC&nbsp;</td>
</tr>

<tr>
<td>13/09/2013 at 06:00&nbsp;</td>
<td>THUN GENIUS&nbsp;</td>
<td>Dublin &nbsp;</td>
<td>Valero&nbsp;</td>
<td>GAC&nbsp;</td>
</tr>

<tr>
<td>13/09/2013 at 11:00&nbsp;</td>
<td>CAP LEON&nbsp;</td>
<td>Arzew&nbsp;</td>
<td>Valero 6&nbsp;</td>
<td>Graypen&nbsp;</td>
</tr>

<tr>
<td>13/09/2013 at 19:00&nbsp;</td>
<td>STOLT TEAL&nbsp;</td>
<td>TBA&nbsp;</td>
<td>Valero 1&nbsp;</td>
<td>Cory Bros&nbsp;</td>
</tr>

<tr>
<td>14/09/2013 at 16:00&nbsp;</td>
<td>B GAS LANRICK&nbsp;</td>
<td>Antwerp&nbsp;</td>
<td>Murco 3&nbsp;</td>
<td>S5 Agency World&nbsp;</td>
</tr>

<tr>
<td>15/09/2013 at 09:00&nbsp;</td>
<td>BAYAMO&nbsp;</td>
<td>TBA&nbsp;</td>
<td>Valero&nbsp;</td>
<td>Graypen&nbsp;</td>
</tr>

<tr>
<td>15/09/2013 at 09:00&nbsp;</td>
<td>AMADEA&nbsp;</td>
<td>Cork&nbsp;</td>
<td>Milford Shelf&nbsp;</td>
<td>Inchcape Shipping Services&nbsp;</td>
</tr>

<tr>
<td>15/09/2013 at 12:00&nbsp;</td>
<td>ARRAN&nbsp;</td>
<td>Dublin &nbsp;</td>
<td>Valero&nbsp;</td>
<td>Graypen&nbsp;</td>
</tr>

<tr>
<td>16/09/2013 at 01:00&nbsp;</td>
<td>EKFJORD&nbsp;</td>
<td>Gothenburg&nbsp;</td>
<td>Murco 1&nbsp;</td>
<td>Cory Bros&nbsp;</td>
</tr>

<tr>
<td>16/09/2013 at 21:30&nbsp;</td>
<td>MOZAH&nbsp;</td>
<td>Ras Laffan&nbsp;</td>
<td>South Hook No 1&nbsp;</td>
<td>S5 Agency World&nbsp;</td>
</tr>

<tr>
<td>17/09/2013 at 07:00&nbsp;</td>
<td>STRIDE&nbsp;</td>
<td>Murmansk&nbsp;</td>
<td>Valero 6&nbsp;</td>
<td>Graypen&nbsp;</td>
</tr>
</tbody>
</table>
</center>

如上面的html源代码,我只想搜索每行的第二列,例如BAYAMOSTRIDE应该搜索等

4

2 回答 2

1

您应该考虑为该作业使用适当的 HTML 解析器。

如果这是一次性使用,您可以尝试使用这样的正则表达式:

<tr>[^<]*<td[^>]*>[^<]*</td>[^<]*<td[^>]*>([^<]+)

正则表达式101演示

编辑:这是一个ideone 演示

于 2013-09-17T09:18:42.113 回答
0

一个简单的开始:

<tr>.*?<td>.*?</td>.*?<td>(.*?)</td>

但这并不完全奏效,如果你有单列行怎么办?它将继续运行,直到您到达下一行并匹配那里的第一列。

为此,我们需要一些更复杂的东西:

<tr>(?:.(?!<tr>))*?<td>.*?</td>(?:.(?!<tr>))*?<td>(.*?)</td>

它显然不会很好地用于嵌套表和事物,但这是尝试使用正则表达式解析 HTML 的危险。有关这方面的更多信息,一般来说,我建议您阅读内容。

测试

解释:

(?:...)是一个非捕获组,它不会改变匹配,只是防止它被记录在一个组中。

(?!...)是负前瞻,如果以下字符与某些模式不匹配,则匹配。

于 2013-09-17T09:18:57.087 回答