1

はじめに、HTMLの解析には、信頼性が低く、100%安全ではないなどの理由で、正規表現を使用するべきではないことを知っています。ただし、これは、他の何よりも正規表現の学習演習にすぎません。

したがって、私の例では、bbcWebサイトhttp://www.bbc.co.uk/sport/football/premier-league/tableを使用しています。

プロジェクトは最初のテーブルのtbodyを解析しています。検索値に一致する要素のみが返されるように検索しようとしています。たとえば、「manc」という検索が与えられた場合、マンチェスターシティとマンチェスターユナイテッドのtrタグが必要になります(URLから一致)。

しかし、これまでのところ、これは<tr\b[^>]*>(.*?)manc(.*?)</tr>マンチェスターの最初のtrから最後のtrまで一致し、manutdの期待される結果を返します。誰かが私がこの正規表現でどこが間違っているのか指摘できますか?

編集:ソース(トリミング)

<tbody id="trc-20-118996114-3">
  <tr id="team-138824012" class="team first">
    <td class="statistics"></td>
    <td class='position'>
      <span class='moving-up'>Moving up</span>
      <span class='position-number'>1</span>
    </td>
    <td class="team-name">
      <a href='http://www.bbc.co.uk/sport/football/teams/arsenal'>Arsenal</a>
    </td>
    <td class="played">0</td>

    <td class="home-won">
      <span>0</span>
    </td>
    <td class="home-drawn">0</td>
    <td class="home-lost">0</td>
    <td class="home-for">0</td>
    <td class="home-against">0</td>
    <td class="away-won">
      <span>0</span>
    </td>
    <td class="away-drawn">0</td>
    <td class="away-lost">0</td>
    <td class="away-for">0</td>
    <td class="away-against">0</td>
    <td class="goal-difference">0</td>
    <td class="points">0</td>
    <td class="last-10-games">
      <ol>
        <li class="win" title="Win">
          <span>Win</span>
        </li>
        <li class="draw" title="Draw">
          <span>Draw</span>
        </li>
        <li class="draw" title="Draw">
          <span>Draw</span>
        </li>
        <li class="draw" title="Draw">
          <span>Draw</span>
        </li>
        <li class="loss" title="Loss">
          <span>Loss</span>
        </li>
        <li class="win" title="Win">
          <span>Win</span>
        </li>
        <li class="win" title="Win">
          <span>Win</span>
        </li>
        <li class="loss" title="Loss">
          <span>Loss</span>
        </li>
        <li class="win" title="Win">
          <span>Win</span>
        </li>
        <li class="win last" title="Win">
          <span>Win</span>
        </li>
      </ol>
    </td>
    <td class="status">
      <a class="report" href="http://www.bbc.co.uk/sport/0/football/17973141">Report</a>
    </td>
  </tr>
  <tr id="team-137316633" class="team">
    <td class="statistics"></td>
    <td class='position'>
      <span class='moving-up'>Moving up</span>
      <span class='position-number'>2</span>
    </td>
    <td class="team-name">
      <a href='http://www.bbc.co.uk/sport/football/teams/aston-villa'>Aston Villa</a>
    </td>
    <td class="played">0</td>

    <td class="home-won">
      <span>0</span>
    </td>
    <td class="home-drawn">0</td>
    <td class="home-lost">0</td>
    <td class="home-for">0</td>
    <td class="home-against">0</td>
    <td class="away-won">
      <span>0</span>
    </td>
    <td class="away-drawn">0</td>
    <td class="away-lost">0</td>
    <td class="away-for">0</td>
    <td class="away-against">0</td>
    <td class="goal-difference">0</td>
    <td class="points">0</td>
    <td class="last-10-games">
      <ol>
        <li class="loss" title="Loss">
          <span>Loss</span>
        </li>
        <li class="draw" title="Draw">
          <span>Draw</span>
        </li>
        <li class="draw" title="Draw">
          <span>Draw</span>
        </li>
        <li class="loss" title="Loss">
          <span>Loss</span>
        </li>
        <li class="draw" title="Draw">
          <span>Draw</span>
        </li>
        <li class="loss" title="Loss">
          <span>Loss</span>
        </li>
        <li class="draw" title="Draw">
          <span>Draw</span>
        </li>
        <li class="draw" title="Draw">
          <span>Draw</span>
        </li>
        <li class="loss" title="Loss">
          <span>Loss</span>
        </li>
        <li class="loss last" title="Loss">
          <span>Loss</span>
        </li>
      </ol>
    </td>
    <td class="status">
      <a class="report" href="http://www.bbc.co.uk/sport/0/football/17973120">Report</a>
    </td>
  </tr>
  <tr id="team-137318151" class="team">
    <td class="statistics"></td>
    <td class='position'>
      <span class='moving-down'>Moving down</span>
      <span class='position-number'>7</span>
    </td>
    <td class="team-name">
      <a href='http://www.bbc.co.uk/sport/football/teams/manchester-city'>Man City</a>
    </td>
    <td class="played">0</td>

    <td class="home-won">
      <span>0</span>
    </td>
    <td class="home-drawn">0</td>
    <td class="home-lost">0</td>
    <td class="home-for">0</td>
    <td class="home-against">0</td>
    <td class="away-won">
      <span>0</span>
    </td>
    <td class="away-drawn">0</td>
    <td class="away-lost">0</td>
    <td class="away-for">0</td>
    <td class="away-against">0</td>
    <td class="goal-difference">0</td>
    <td class="points">0</td>
    <td class="last-10-games">
      <ol>
        <li class="win" title="Win">
          <span>Win</span>
        </li>
        <li class="win" title="Win">
          <span>Win</span>
        </li>
        <li class="win" title="Win">
          <span>Win</span>
        </li>
        <li class="win" title="Win">
          <span>Win</span>
        </li>
        <li class="win" title="Win">
          <span>Win</span>
        </li>
        <li class="win" title="Win">
          <span>Win</span>
        </li>
        <li class="loss" title="Loss">
          <span>Loss</span>
        </li>
        <li class="draw" title="Draw">
          <span>Draw</span>
        </li>
        <li class="draw" title="Draw">
          <span>Draw</span>
        </li>
        <li class="win last" title="Win">
          <span>Win</span>
        </li>
      </ol>
    </td>
    <td class="status">
      <a class="report" href="http://www.bbc.co.uk/sport/0/football/17973148">Report</a>
    </td>
  </tr>
  <tr id="team-137318152" class="team">
    <td class="statistics"></td>
    <td class='position'>
      <span class='moving-down'>Moving down</span>
      <span class='position-number'>8</span>
    </td>
    <td class="team-name">
      <a href='http://www.bbc.co.uk/sport/football/teams/manchester-united'>Man Utd</a>
    </td>
    <td class="played">0</td>

    <td class="home-won">
      <span>0</span>
    </td>
    <td class="home-drawn">0</td>
    <td class="home-lost">0</td>
    <td class="home-for">0</td>
    <td class="home-against">0</td>
    <td class="away-won">
      <span>0</span>
    </td>
    <td class="away-drawn">0</td>
    <td class="away-lost">0</td>
    <td class="away-for">0</td>
    <td class="away-against">0</td>
    <td class="goal-difference">0</td>
    <td class="points">0</td>
    <td class="last-10-games">
      <ol>
        <li class="win" title="Win">
          <span>Win</span>
        </li>
        <li class="win" title="Win">
          <span>Win</span>
        </li>
        <li class="loss" title="Loss">
          <span>Loss</span>
        </li>
        <li class="draw" title="Draw">
          <span>Draw</span>
        </li>
        <li class="win" title="Win">
          <span>Win</span>
        </li>
        <li class="loss" title="Loss">
          <span>Loss</span>
        </li>
        <li class="win" title="Win">
          <span>Win</span>
        </li>
        <li class="win" title="Win">
          <span>Win</span>
        </li>
        <li class="win" title="Win">
          <span>Win</span>
        </li>
        <li class="win last" title="Win">
          <span>Win</span>
        </li>
      </ol>
    </td>
    <td class="status">
      <a class="report" href="http://www.bbc.co.uk/sport/0/football/17973162">Report</a>
    </td>
  </tr>
</tbody>
4

2 に答える 2

0

問題は、正規表現が広すぎることです。あなたが求めているものを見てください:

<tr\b[^>]*>(.*?)manc(.*?)</tr>

少し単純化しましょう。

<tr>.*?manc.*?</tr>

だからあなたは言っている、わかりました。trに続けて何か、次にmanc、次にANYTHING、そして最後のtrを一致させる必要があります。それで。もちろん、何が起こるかというと、正規表現は最初のtrから始まり、正常になります。私はmancを見つけるまで私にマッチングを続けさせてくれるtrを持っています。その間に、あなたはおそらく他のtrの束を通過しただけです。しかし、あなたの正規表現は気にしません。

これを試して:

<tr>(?:(?!</tr>).)*manc.+?</tr>

または、私はあなたの例で推測します:

<tr\b[^>]*>(?:(?!</tr>).)*manc.+?</tr>
于 2012-07-02T14:26:49.387 に答える
0

REGEXは、パーサーとして設計されていないため、これには適していません。状況が非常に寛容である場合を除いて、特にJavaScript(かなり原始的なREGEX実装を持っている)では、どの開始タグがどの終了タグと一致するかを確実に確認することは期待できません。

まず、空白文字と一致しないため、後者は複数行で機能せず、言及したテーブルのHTMLが複数行にあるため、[\s\S]ではなくを使用する必要があります。.前者は、空間的および非空間的すべて、つまりこれまでのすべてに一致する範囲であるため、そうなります。

これを念頭に置いて、あなたはこれをしたくなるかもしれません:

/<tr\b[^>]*?>[\s\S]*?manc[\s\S]*?<\/tr>/gi

...つまり、文字列'manc'に言及しているすべての行を取得します。

次の簡略化されたHTMLを使用します。

<table>
    <tr>
        <td>Notts County</td>
    </tr>
    <tr>
        <td>Manchester United</td>
    </tr>
    <tr>
        <td>Arsenal</td>
    </tr>
</table>

...上記のパターンは一致します

<tr>
    <td>Notts County</td>
</tr>
<tr>
    <td>Manchester United</td>
</tr>

これは論理的です。REGEXパターンは最初から始まり、開始点tr(Notts County)を見つけ、不確定な数のオプション文字の後に文字列「Manc」が見つかるかどうかを尋ねられます。です。

もちろん、問題は、「Manc」を見つける際に、パターンで許可されているため、無意識のうちにtr境界を越えて次の行に移動したことです。[\s\S]*?

REGEXではシーケンスを否定できないため、これを防ぐことはできません。範囲内の文字のみです(否定的な先読みアサーションと後読みアサーションの場合を除く)。

要するに、どうしても正規表現を学ぶのですが、最初は難しい文字列を選んだのです:)

于 2012-07-02T14:02:16.867 に答える