[英]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.Document
和javax.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.