1

我有一个网页转换为字符串,我试图从这一行中提取三个数字。

<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,但无论何时我尝试编辑上面的正则表达式,它只会在控制台上输出完整的网页。有人有什么建议吗??谢谢

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 回答