我将网页转换为字符串,我试图从此行中提取三个数字。
<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,但是当我尝试编辑上面的正则表达式时,只需在控制台上输出完整的网页。任何人都有任何建议? 感谢
答案 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+)
执行以下操作: