Java RegEx - 仅从网页中提取数字

时间:2012-09-04 11:38:18

标签: java regex string

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

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

从上面的一行我已经开始提取第一个&#39; 1&#39;使用这个

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,但是当我尝试编辑上面的正则表达式时,只需在控制台上输出完整的网页。任何人都有任何建议? 感谢

5 个答案:

答案 0 :(得分:2)

鉴于在HTML / XML上使用正则表达式是一个臭名昭着的问题(请参阅此处definitive answer),我建议使用HTML解析器可靠(例如{{3 - 虽然它是一个HTML漂亮的打印机,但它也为文档提供了一个DOM接口)

答案 1 :(得分: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的建议。

答案 2 :(得分:1)

<td class=\"col_stat\">(.+)</td>
这个正则表达式很贪婪。如果您希望使用数字 - 将其更改为:

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

我宁愿建议使用XPath进行这种匹配,请参阅Saxon和TagSoup

答案 3 :(得分:0)

这是因为你的匹配器是greedy。你需要一个非贪婪的匹配器来解决这个问题。

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);
    }

答案 4 :(得分:0)

试试这个正则表达式:

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

执行以下操作:

  1. 搜索您的起始字符串
  2. 选择一个小数点链
  3. 跳过任何非小数
  4. 选择一个小数点链
  5. 跳过任何非小数
  6. 选择一个小数点链