-1

以下のソースコードを含むhtmlページがあります。私の要件は、「船名」という見出しの列でのみ特定の単語を検索することです。この特定の列のデータのみを抽出するのに役立つ正規表現を知りたいです。

次の 2 つの正規表現を使用して、テーブルのヘッダーと行を抽出しました。

table headers =@"<th[^>]*?>(?<Value>.*?)</th>"この正規表現により、列 Ship Name を見つけることができます

テーブル行 =@"<td>(.*?)</td>"この正規表現により、すべての行のすべての列を取得できます

しかし、私の必要性は、すべての行の2列目を見つけることだけです。私がこれを行うことができるそのような正規表現または私の仕事を成し遂げることができる他の方法が存在するかどうか助けてください。私を助けてください

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のソースコードのように、例としてのみBAYAMO、すべての行の2列目のみを検索したいSTRIDEなどを検索する必要があります

4

2 に答える 2

1

そのジョブに適切な HTML パーサーを使用することを検討する必要があります。

ただし、それが 1 回限りの使用である場合は、次のような正規表現を使用してみてください。

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

正規表現101のデモ

編集: そして、ここにideone demo があります。

于 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 に答える