在String中获取表 - Regex java

时间:2015-05-06 19:00:21

标签: java regex

我在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());

3 个答案:

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