使用Java正则表达式匹配重复的HTML模式

时间:2015-03-24 11:14:05

标签: java regex

可能有人早些时候问过这个问题,但我找不到解决方案,所以发布这个问题。

我需要解析下面的HTML字符串,以查找每个项目的ID,时间和主题:

<div class="list" id="1">
  <div class="time">12:01 PM</div>
  <div class="subject">[This is dummy Subject1] This is some dummy strings after subject</div>
<div/>
<div class="list" id="2">
  <div class="time">12:01 PM</div>
  <div class="subject">[This is dummy Subject2] This is some dummy strings after subject</div>
<div/>
<div class="list" id="3">
  <div class="time">12:01 PM</div>
  <div class="subject">[This is dummy Subject3] This is some dummy strings after subject</div>
<div/>

输出必须像:id|time|subject

2 个答案:

答案 0 :(得分:1)

在此处查看演示https://regex101.com/r/fN1fZ0/1

var re = /.*?id="(.*?)".*?time">(.*?)<\/.*?subject">\[(.*?)\].*?|.*$/gs; 
var subst = '$1|$2|$3\n'; 

var result = str.replace(re, subst);

答案 1 :(得分:0)

您的主题指定“使用正则表达式”,但这可能是一个非常糟糕的方法。即使你有一些工作,它可能最终会变得非常脆弱 - 这意味着看似无关紧要(从HTML的角度来看,完全合法)输入的改变会导致代码失败。处理XML中的所有语法复杂性(以及HTML中)可能是一场噩梦。例如。属性值可以用单引号或双引号引用;字符实体(如“&amp; quot;”可以出现在属性值或元素文本中;元素文本可以以CDATA格式出现;等等。

更可靠的方法是使用javax.xml包中提供的XML解析解决方案之一。您有多种选择,其中任何一种都可以作为解决问题的基础。

一种简单的方法是使用org.w3c.dom.Documentjavax.xml.xpath.XpathExpression的组合。使用前者,您的XML将被解析,您最终将其全部内容放在Document类型的可导航对象中。您可以直接导航以查找您要查找的数据,但您也可以使用XPathExpression来搜索您。

如果输入文档非常大,则此方法可能不实用。在这种情况下,您可能会查看org.xml.sax包,它提供了流式XML解析器。您将无法使用XPath,但您必须编写的处理程序应该很容易解决您的问题。

以下是使用Document / XPathExpression方法的代码。如果您将HTML代码段(在"<div/>"中替换为"</div>",并在"<html><body>...</body></html>"中)包含在名为“foo.html”的文件旁边,并且与Test.class文件一起保存,你应该能够成功运行它。

package test;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import java.io.IOException;
import java.io.InputStream;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;



public class Test {

  public static void main(String[] argv) throws XPathExpressionException, SAXException, IOException, ParserConfigurationException {
    XPathFactory fac = XPathFactory.newInstance();
    XPathExpression idDivExpr = fac.newXPath().compile("//div[@class='list']");
    XPathExpression timeExpr = fac.newXPath().compile("div[@class='time']");
    XPathExpression subjExpr = fac.newXPath().compile("div[@class='subject']");
    InputStream in = Test.class.getResourceAsStream("foo.html");
    Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(in);
    NodeList nl = (NodeList) idDivExpr.evaluate(doc, XPathConstants.NODESET);
    for (int i = 0; i < nl.getLength(); i++) {
      Element elt = (Element) nl.item(i);
      System.out.printf("%s|%s|%s\n",
          elt.getAttribute("id"),
          timeExpr.evaluate(elt),
          subjExpr.evaluate(elt));
    }
  }
}