1

2 行の HTML からテキストを解析しようとしています。

Dim PattStats As New Regex("class=""head"">(.+?)</td>"+ 
                           "\n<td>(.+?)</td>")
Dim makor As MatchCollection = PattStats.Matches(page)

For Each MatchMak As Match In makor
    ListView3.Items.Add(MatchMak.Groups(1).Value)
Next

次の行に一致するように を追加しました\nが、何らかの理由で機能しません。正規表現を実行しているソースは次のとおりです。

<table class="table table-striped table-bordered table-condensed">
  <tbody>
    <tr>
      <td class="head">Health Points:</td>
      <td>445 (+85 / per level)</td>
      <td class="head">Health Regen:</td>
      <td>7.25</td>
    </tr>
    <tr>
      <td class="head">Energy:</td>
      <td>200</td>
      <td class="head">Energy Regen:</td>
      <td>50</td>
    </tr>
    <tr>
      <td class="head">Damage:</td>
      <td>53 (+3.2 / per level)</td>
      <td class="head">Attack Speed:</td>
      <td>0.694 (+3.1 / per level)</td>
    </tr>           
    <tr>
      <td class="head">Attack Range:</td>
      <td>125</td>
      <td class="head">Movement Speed:</td>
      <td>325</td>
    </tr>
    <tr>
      <td class="head">Armor:</td>
      <td>16.5 (+3.5 / per level)</td>
      <td class="head">Magic Resistance:</td>
      <td>30 (+1.25 / per level)</td>
    </tr>       
    <tr>
      <td class="head">Influence Points (IP):</td>
      <td>3150</td>
      <td class="head">Riot Points (RP):</td>
      <td>975</td>
    </tr>
  </tbody>
</table>

1つの正規表現で最初と次の行を一致させたい<td class...>:/

4

1 に答える 1

1

説明

この正規表現はtdタグを見つけて、2 つのグループで返します。

<td\b[^>]*>([^<]*)<\/td>[^<]*<td\b[^>]*>([^<]*)<\/td>

ここに画像の説明を入力

概要

  • <td\b[^>]*>最初の td タグを見つけて、すべての属性を消費します
  • ([^<]*)最初の内部テキストをキャプチャします。これは貪欲になる可能性がありますが、セルにネストされたタグがないことを前提としています
  • <\/td>終了タグを見つける
  • [^<]*これは、最初と 2 番目の td タグの間に追加のタグがないことを前提としています。
  • <td\b[^>]*>2 番目の td タグを見つけて、すべての属性を消費します
  • ([^<]*)2 番目の内部テキストをキャプチャします。これは貪欲になる可能性がありますが、セルにネストされたタグがないことを前提としています
  • <\/td>終了タグを見つける

グループ

グループ 0 は文字列全体を取得します

  1. 最初の td グループがあります
  2. 2番目のtdグループがあります

VB.NET コード例:

Imports System.Text.RegularExpressions
Module Module1
  Sub Main()
    Dim sourcestring as String = "replace with your source string"
    Dim re As Regex = New Regex("<td\b[^>]*>([^<]*)<\/td>[^<]*<td\b[^>]*>([^<]*)<\/td>",RegexOptions.IgnoreCase OR RegexOptions.Singleline)
    Dim mc as MatchCollection = re.Matches(sourcestring)
    Dim mIdx as Integer = 0
    For each m as Match in mc
      For groupIdx As Integer = 0 To m.Groups.Count - 1
        Console.WriteLine("[{0}][{1}] = {2}", mIdx, re.GetGroupNames(groupIdx), m.Groups(groupIdx).Value)
      Next
      mIdx=mIdx+1
    Next
  End Sub
End Module

$matches Array:
(
    [0] => Array
        (
            [0] => <td class="head">Health Points:</td>
          <td>445 (+85 / per level)</td>
            [1] => <td class="head">Health Regen:</td>
          <td>7.25</td>
            [2] => <td class="head">Energy:</td>
          <td>200</td>
            [3] => <td class="head">Energy Regen:</td>
          <td>50</td>
            [4] => <td class="head">Damage:</td>
          <td>53 (+3.2 / per level)</td>
            [5] => <td class="head">Attack Speed:</td>
          <td>0.694 (+3.1 / per level)</td>
            [6] => <td class="head">Attack Range:</td>
          <td>125</td>
            [7] => <td class="head">Movement Speed:</td>
          <td>325</td>
            [8] => <td class="head">Armor:</td>
          <td>16.5 (+3.5 / per level)</td>
            [9] => <td class="head">Magic Resistance:</td>
          <td>30 (+1.25 / per level)</td>
            [10] => <td class="head">Influence Points (IP):</td>
          <td>3150</td>
            [11] => <td class="head">Riot Points (RP):</td>
          <td>975</td>
        )

    [1] => Array
        (
            [0] => Health Points:
            [1] => Health Regen:
            [2] => Energy:
            [3] => Energy Regen:
            [4] => Damage:
            [5] => Attack Speed:
            [6] => Attack Range:
            [7] => Movement Speed:
            [8] => Armor:
            [9] => Magic Resistance:
            [10] => Influence Points (IP):
            [11] => Riot Points (RP):
        )

    [2] => Array
        (
            [0] => 445 (+85 / per level)
            [1] => 7.25
            [2] => 200
            [3] => 50
            [4] => 53 (+3.2 / per level)
            [5] => 0.694 (+3.1 / per level)
            [6] => 125
            [7] => 325
            [8] => 16.5 (+3.5 / per level)
            [9] => 30 (+1.25 / per level)
            [10] => 3150
            [11] => 975
        )

)

免責事項

正規表現でhtmlを解析することは、予測できないエッジケースがたくさんあるため、実際には最良の解決策ではありません. ただし、この場合、入力文字列が常にこの基本的なものであり、正規表現が 100% の確率で機能しないというリスクを受け入れる意思がある場合、この解決策はおそらくうまくいくでしょう。

于 2013-05-29T12:27:37.620 に答える