2013-05-29 4 views
1

Я пытаюсь разобрать текст из двух строк HTML.Regex n не работает

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> 

Я хотел бы, чтобы соответствовать первому <td class...> и следующую строку в один регулярное выражение:/

+0

Попробуйте использовать '\ r \ n', а не просто' \ n' –

+1

Вы действительно можете использовать xpath для этого. –

+0

Daniel: Пробовал, но он не работал :( Casimir: никогда не использовал xpath, поэтому я не знаю, что это такое:/ –

ответ

1

Описание

Это регулярное выражение будет найти td теги и вернуть их в группы по два.

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

enter image description here

Резюме

  • <td\b[^>]*> найти первый TD тег и потреблять любые атрибуты
  • ([^<]*) захватить первый внутренний текст, это может быть жадным, но мы предполагаем, что клетки не имеет вложенных тегов
  • <\/td> найти Тесный тег
  • [^<]* двигаться мимо всех остальных текста до вас, это предполагает, что не существуют какие-либо дополнительные теги между первым и вторым тдом тегом
  • <td\b[^>]*> найти второй TD щество и потреблять любые атрибуты
  • ([^<]*) захватить второй внутренний текст, это может быть жадным, но мы предполагаем, что клетка не имеет вложенных тегов
  • <\/td> найти закрывающий тег

Группы

Группа 0 получит всю строку

  1. будет иметь первую группу TD
  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% случаев, это решение, вероятно, сработает для вас.

Смежные вопросы