1

Webページを文字列に変換し、この行から3つの数値を抽出しようとしています。

<td class="col_stat">1</td><td class="col_stat">0</td><td class="col_stat">1</td>

上記の行から、これを使用して最初の「1」を抽出しています。

String filePattern = "<td class=\"col_stat\">(.+)</td>";
    pattern = Pattern.compile(filePattern);
    matcher = pattern.matcher(text);
    if(matcher.find()){
        String number = matcher.group(1);
        System.out.println(number);
    }       

ここで、0と最後の1を抽出しますが、上の正規表現を編集しようとすると、コンソールに完全なWebページが出力されます。誰か提案がありますか?ありがとう

4

5 に答える 5

2

HTML / XMLで正規表現を使用することは悪名高い落とし穴であるため(決定的な答えについてはここを参照)、 HTMLパーサー(たとえば、JTidy -HTMLプリティプリンターですが、DOMインターフェイスも提供します)を使用してこれを確実に行うことをお勧めしますドキュメントへ)

于 2012-09-04T11:41:46.767 に答える
2

(\d+)正規表現のマッチングは貪欲です。代わりにこれを試してください(代わりにのみを探します((.+)最後まですべてに一致します</td>):

String text = 
    "<td class=\"col_stat\">1</td>" + 
    "<td class=\"col_stat\">0</td>" + 
    "<td class=\"col_stat\">1</td>";
String filePattern = "<td class=\"col_stat\">(\\d+)</td>";
Pattern pattern = Pattern.compile(filePattern);
Matcher matcher = pattern.matcher(text);
while (matcher.find())
{
    String number = matcher.group(1);
    System.out.println(number);
}

関連するメモとして、HTMLを解釈するためのより構造化されたアプローチを使用するという他の提案に完全に同意します。

于 2012-09-04T11:45:33.643 に答える
1
<td class=\"col_stat\">(.+)</td>

この正規表現は貪欲です。数字で機能させる場合は、次のように変更します。

<td class=\"col_stat\">(\\d+?)</td>

そのような種類のマッチングにはXPathを使用することをお勧めします。SaxonとTagSoupを参照してください。

于 2012-09-04T11:45:41.023 に答える
0

これは、マッチャーが貪欲だからです。これを修正するには、欲張りでないマッチャーが必要です。

String text = "<td class=\"col_stat\">1</td><td class=\"col_stat\">0</td><td class=\"col_stat\">1</td>";

    String filePattern = "<td class=\"col_stat\">(.+?)</td>";
    Pattern pattern = Pattern.compile(filePattern);
    Matcher matcher = pattern.matcher(text);
    while (matcher.find()) {
        String number = matcher.group(1);
        System.out.println(number);
    }
于 2012-09-04T11:49:05.307 に答える
0

この正規表現を試してください:

<td class="col_stat">(\d+)[^\d]+(\d+)[^\d]+(\d+)

これは次のことを行います。

  1. 開始文字列を検索します
  2. 小数のチェーンを選択します
  3. 非小数点をスキップする
  4. 小数のチェーンを選択します
  5. 非小数点をスキップする
  6. 小数のチェーンを選択します
于 2012-09-04T11:50:01.417 に答える