我在java字符串中有一个html。在这个字符串中,我有很多表,有些表里面有 div 标签。 我正在尝试使用正则表达式获取带有div标签的表格,但我遇到了困难。
字符串示例:
<table>
Normal table
</table>
<table> <--- I want to get this table
<tr>
<td>
<div>
...
</div>
</td>
</tr>
...
</table>
我尝试<table.*<div.*</div>.*</table>
作为正则表达式,但它给了我整个字符串而不仅仅是第二个表。我试过像<table(.^(</table>))*<div.*</div>.*</table>
这样的东西,但它不起作用:(
****编辑**** 一个简单的代码
String test = "<table>Normal table</table><table> <--- I want to get this table<tr>" +
"<td><div>...</div></td></tr>...</table>";
Pattern pattern = Pattern.compile("<table.*<div.*</div>.*</table>", Pattern.DOTALL);
Matcher matcher = pattern.matcher(test);
if( matcher.find())
System.out.println("Teste " + matcher.group());
答案 0 :(得分:2)
如何使用xpath?这应该没问题。
public class TableParse {
private static final String HTML = "<table>\n"+
" Normal table\n"+
"</table>\n"+
"\n"+
"<table> \n"+
" <tr>\n"+
" <td>\n"+
" <div> \n"+
" ...\n"+
" </div>\n"+
" </td>\n"+
" </tr>\n"+
"</table>";
public static void main(String[] args) throws Exception {
xpath();
}
public static void xpath() throws Exception {
TagNode tagNode = new HtmlCleaner().clean(HTML);
Document doc = new DomSerializer(new CleanerProperties()).createDOM(tagNode);
XPath xpath = XPathFactory.newInstance().newXPath();
Node tableNode = (Node) xpath.evaluate("//table[.//div]", doc, XPathConstants.NODE);
StringWriter writer = new StringWriter();
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.transform(new DOMSource(tableNode), new StreamResult(writer));
String xml = writer.toString();
System.out.println(xml);
}
}
答案 1 :(得分:1)
正则表达式旨在根据regular languages解析regular grammar。 HTML不是由常规语法定义的,因此请不要使用use regex来解析HTML。
有很多好的和简单的HTML parsers for Java,请看看它们。 JSoup是一个很好的起点。
答案 2 :(得分:0)
如果您仍然希望在阅读评论后仍然使用正则表达式,则可以使用以下内容:
<table>(?=(?:(?!</table>)[\\s\\S])*?<div>)[\\s\\S]*?</table>
说明:
<div>
代码,同时确保在</table>
(表格末尾)代码后不要向前看。Java代码:
String test = "<table>Normal table</table><table> <--- I want to get this table<tr>" +
"<td><div>...</div></td></tr>...</table>";
Pattern pattern = Pattern.compile("<table>(?=(?:(?!</table>)[\\s\\S])*?<div>)[\\s\\S]*?</table>");
Matcher matcher = pattern.matcher(test);
if( matcher.find())
System.out.println("Teste " + matcher.group());
请参阅working demo