我正在尝试在标记<dev>Text Here</dev>
:
<div id="tt" class="info">
Text Here
</div>
Output: Text Here
如何在java中使用正则表达式实现此目的?感谢。
修改
我正在使用HtmlUnit:
currentPage.getElementById("tt").asXml();
currentPage.getElementById("tt").asText(); // returns ""
答案 0 :(得分:5)
别。使用正确的解析器并且只是拉出你感兴趣的元素要容易得多。使用正则表达式非常困难。
答案 1 :(得分:2)
永远不要尝试使用正则表达式解析XML或HTML。
这在理论上是不可能的:XML和HTML的语法是一种比正则表达式可以处理的语法更丰富的语法。
无论如何,你会弄错,原因与理论上的限制无关:你需要考虑太多的细微差别,如空白,CDATA部分,评论等。
并不缺少免费的现成解析器,可以正常,快速地完成工作。
答案 2 :(得分:1)
如果是HTML,你试图解析或尝试Jsoup,http://watchitlater.com/blog/2010/09/jsoup-beautifulsoup-for-java/
答案 3 :(得分:1)
你可以使用正则表达式,只要你不介意完全按照你说的做(也可能不是你的意思):
在字符串上尝试regexp <div.*>(.*)</div>
:
<div id="tt" class="info">
<a href="../link.htm>Clicky</a>
</div>
您将获得值<a href="../link.htm>Clicky</a>
,而不是您想要的值Clicky
。由于XML可以无限制地嵌套,因此正则表达式无法与它们匹配,除非您做出某些牺牲(例如您想要容纳的每个级别的手动编码)。
答案 4 :(得分:1)
使用正则表达式,您可以使用以下内容:
String s = "<div id=\"tt\" class=\"info\">\n Text Here \n</div>";
System.out.println(s);
Pattern p = Pattern.compile("<div id=\"tt\" class=\"info\">\\s*([^<]+?)\\s*</div>", Pattern.DOTALL);
Matcher m = p.matcher(s);
if (m.find()) {
System.out.println(m.group(1)); // Text Here
}
但是,更好的解决方案是使用JTidy将HTML解析为XHTML,然后使用XPath(//div[@id = 'tt']/text()
)提取所需的文本。这些方面的东西:
public static void main(String[] args) throws Exception {
// Create a new JTidy instance and set options
Tidy tidy = new Tidy();
tidy.setXHTML(true);
// Parse an HTML page into a DOM document
URL url = new URL("http://something.com/something.html");
Document doc = tidy.parseDOM(url.openStream(), System.out);
// Use XPath to obtain whatever you want from the (X)HTML
XPath xpath = XPathFactory.newInstance().newXPath();
XPathExpression expr = xpath.compile("//div[@id = 'tt']/text()");
String text = (String)expr.evaluate(doc, XPathConstants.STRING);
System.out.println(text); // Text Here
}