我们可以说字符串为<title>xyz</title>
我想从字符串中提取xyz
。
我用过:
Pattern titlePattern = Pattern.compile("<title>\\s*(.+?)\\s*</title>");
Matcher titleMatcher = titlePattern.matcher(line);
String title=titleMatcher.group(1));
但我收到了titlePattern.matcher(line);
的错误答案 0 :(得分:6)
你说你的错误发生得更早(实际错误是什么,运行没有错误),但解决之后你需要在匹配器上调用find()
一次来实际搜索模式:< / p>
if(titleMatcher.find()){
String title = titleMatcher.group(1);
}
如果您真的与具有非转义HTML实体(如
)的字符串匹配,请不要这样做<title>xyz</title>
然后你的正则表达式必须使用这些,而不是转义的实体:
"<title>\\s*(.+?)\\s*</title>"
此外,您应该谨慎对待{3 can't really parse HTML or XML with regular expressions。如果您正在使用XML,则使用XML解析器要容易得多,例如JDOM
答案 1 :(得分:2)
技术上不是答案,但您不应该使用正则表达式来解析HTML。你可以尝试,你可以逃脱它的简单任务,但HTML可以变得丑陋。有许多Java库可以很好地解析HTML / XML。如果您要使用HTML / XML进行大量工作,那么值得花时间学习它们。
答案 2 :(得分:1)
正如其他人所建议的那样,用正则表达式解析HTML / XML可能不是一个好主意。您可以使用标准Java API解析XML文档,但我不建议这样做。正如Fabian Steeg已经回答的那样,使用JDOM或类似的开源库来解析XML可能会更好。
使用javax.xml.parsers,您可以执行以下操作:
String xml = "<title>abc</title>";
DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
Document doc = docBuilder.parse(new InputSource(new StringReader(xml)));
NodeList nodeList = doc.getElementsByTagName("title");
String title = nodeList.item(0).getTextContent();
这会将您的XML字符串解析为Document对象,您可以将其用于进一步查找。虽然API有点可怕。
另一种方法是使用XPath进行查找:
XPathFactory xpathFactory = XPathFactory.newInstance();
XPath xPath = xpathFactory.newXPath();
String titleByXpath = xPath.evaluate("/title/text()", new InputSource(new StringReader(xml)));
// or use the Document for lookup
String titleFromDomByXpath = xPath.evaluate("/title/text()", doc);