簡體   English   中英

使用Java正則表達式匹配重復的HTML模式

[英]Matching repeating HTML pattern using 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

看到一個演示https://regex101.com/r/fN1fZ0/1

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

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

您的主題指定“使用正則表達式”,但這可能是一種非常糟糕的方法。 即使您有工作要做,它也可能最終變得非常脆弱-意味着對輸入的看似微不足道(從HTML的角度來看完全合法)更改將導致您的代碼失敗。 處理XML(以及HTML)的所有語法復雜性可能是一場噩夢。 例如,屬性值可以用單引號或雙引號引起來。 字符實體(如“”)可以出現在屬性值或元素文本中;元素文本可以以CDATA形式出現;等等。

一種更可靠的方法是使用javax.xml包中提供的XML解析解決方案之一。 您有幾種選擇,其中任何一種都可以用作可靠解決問題的基礎。

一種簡單的方法是使用org.w3c.dom.Documentjavax.xml.xpath.XpathExpression的組合。 使用前者,您的XML會被解析,並且最終將其完整內容包含在Document類型的可導航對象中。 您可以直接導航到要查找的數據,但也可以使用XPathExpression進行搜索。

如果您的輸入文檔可能非常大,則此方法可能不切實際。 在這種情況下,您可能需要查看提供流式XML解析器的org.xml.sax包。 您將無法在其中使用XPath,但是您必須編寫的處理程序對於您的問題應該很容易。

這是使用Document / XPathExpression方法的代碼。 如果您保存HTML代碼段(在某些地方用不正確的"<div/>"替換為"</div>"並包裝在"<html><body>...</body></html>" )在Test.class文件旁邊的名為“ foo.html”的文件中,您應該能夠成功運行它。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM