2016-11-09 2 views
0

Ich verstehe, HTML mit einem Regex zu analysieren ist nicht ideal, aber ich habe einen Anwendungsfall dafür.Regex - Wie geschachtelt Wert richtig greifen

Ich habe diese Berichterstattung Bericht/HTML-Seite:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 

<html lang="en"> 

<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
    <title>LCOV - .info.cleaned</title> 
    <link rel="stylesheet" type="text/css" href="gcov.css"> 
</head> 

<body> 

    <table width="100%" border=0 cellspacing=0 cellpadding=0> 
    <tr><td class="title">LCOV - code coverage report</td></tr> 
    <tr><td class="ruler"><img src="glass.png" width=3 height=3 alt=""></td></tr> 

    <tr> 
     <td width="100%"> 
     <table cellpadding=1 border=0 width="100%"> 
      <tr> 
      <td width="10%" class="headerItem">Current view:</td> 
      <td width="35%" class="headerValue">top level</td> 
      <td width="5%"></td> 
      <td width="15%"></td> 
      <td width="10%" class="headerCovTableHead">Hit</td> 
      <td width="10%" class="headerCovTableHead">Total</td> 
      <td width="15%" class="headerCovTableHead">Coverage</td> 
      </tr> 
      <tr> 
      <td class="headerItem">Test:</td> 
      <td class="headerValue">.info.cleaned</td> 
      <td></td> 
      <td class="headerItem">Lines:</td> 
      <td class="headerCovTableEntry">399</td> 
      <td class="headerCovTableEntry">1019</td> 
      <td class="headerCovTableEntryLo">39.2 %</td> 
      </tr> 
      <tr> 
      <td class="headerItem">Date:</td> 
      <td class="headerValue">2016-11-07</td> 
      <td></td> 
      <td class="headerItem">Functions:</td> 
      <td class="headerCovTableEntry">22</td> 
      <td class="headerCovTableEntry">67</td> 
      <td class="headerCovTableEntryLo">32.8 %</td> 
      </tr> 
      <tr><td><img src="glass.png" width=3 height=3 alt=""></td></tr> 
     </table> 
     </td> 
    </tr> 

    <tr><td class="ruler"><img src="glass.png" width=3 height=3 alt=""></td></tr> 
    </table> 

    <center> 
    <table width="80%" cellpadding=1 cellspacing=1 border=0> 

    <tr> 
     <td width="50%"><br></td> 
     <td width="10%"></td> 
     <td width="10%"></td> 
     <td width="10%"></td> 
     <td width="10%"></td> 
     <td width="10%"></td> 
    </tr> 

    <tr> 
     <td class="tableHead">Directory <span class="tableHeadSort"><img src="glass.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></span></td> 
     <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td> 
     <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td> 
    </tr> 
    <tr> 
     <td class="coverFile"><a href="src/index.html">src</a></td> 
     <td class="coverBar" align="center"> 
     <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=39 height=10 alt="39.2%"><img src="snow.png" width=61 height=10 alt="39.2%"></td></tr></table> 
     </td> 
     <td class="coverPerLo">39.2&nbsp;%</td> 
     <td class="coverNumLo">399/1019</td> 
     <td class="coverPerLo">32.8&nbsp;%</td> 
     <td class="coverNumLo">22/67</td> 
    </tr> 
    </table> 
    </center> 
    <br> 

    <table width="100%" border=0 cellspacing=0 cellpadding=0> 
    <tr><td class="ruler"><img src="glass.png" width=3 height=3 alt=""></td></tr> 
    <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.10</a></td></tr> 
    </table> 
    <br> 

</body> 
</html> 

ich die Daten aus dieser Zeile zu analysieren, bin versucht:

<td class="headerCovTableEntryLo">39.2 %</td> 

als 39,2 (a float-Wert).

ich derzeit diese regex bin mit zwei passenden TD zu finden:

<td class="headerCovTableEntryLo">[0-9.].*?.%<\/td> 

Ich bin Missverständnis, wie Gruppen funktionieren. Ich habe versucht:

(<td class="headerCovTableEntryLo">[0-9.].*?.%<\/td>)[0-9.].*?\1 

Um zu nehmen, was in der ersten Gruppe gefunden wurde und greifen Sie nur die numerischen Werte, aber ich habe keine Übereinstimmungen. Kann mir jemand einen Einblick geben, was ich falsch mache?

+0

Welche Sprache/Werkzeug benutzt du? –

+0

'Regex - Wie geschachtelt Wert richtig greifen?' ... Verwenden Sie nicht Regex, verwenden Sie einen HTML-Parser. –

+0

Vielen Dank beide ... Ich verstehe, HTML-Parser wäre bevorzugt, und ich bin in Schienen. Leider ist dies nicht einfach mit dem System/Kontext, in dem ich arbeite, zu erreichen. – isuPatches

Antwort

2

Möchten Sie das ausführen? (Erfassung nur der Floating-Wert):

<(td) class="headerCovTableEntryLo">([0-9.]+)\s?%<\/\1>

es sehen, hier zu arbeiten: https://regex101.com/r/qprROm/2

Wenn ja, wenn Sie versuchen, das erste Spiel wieder zu verwenden Sie richtig einsetzen mit \1 oder usw., um der erfassten Gruppe zu entsprechen. Aber in deiner Testversion hast du auch die Klasse erfasst, die nicht mit dem schließenden Tag übereinstimmt.

Nicht sicher, das ist wirklich, was Sie versuchen, obwohl zu tun. haha

Plus, in diesem Fall tun <(td)>(.*?)<\/\1> macht keinen Sinn. Es ist mehr usefill wenn Ihr usecase ist so etwas wie dies <(td|th|tr)>(.*?)<\/\1>

Am Ende, wenn ich es tat, würde ich es eher für mehr Flexibilität auf diese Weise tun: (?<=class="headerCovTableEntryLo">)([0-9.]+)(?=\s?%)

es Siehe, hier zu arbeiten: https://regex101.com/r/qprROm/3

+0

Vielen Dank! (? <= class = "headerCovTableEntryLo">) ([0-9.] +) (? = \ s?%) war genau das, was ich brauchte, um den Gleitkommawert zu erfassen – isuPatches