如何在java中使用Pattern matcher?

让我们说字符串是xyz我想从字符串中提取xyz 。 我用了:

 Pattern titlePattern = Pattern.compile("&lttitle&gt\\s*(.+?)\\s*&lt/title&gt"); Matcher titleMatcher = titlePattern.matcher(line); String title=titleMatcher.group(1)); 

但是我收到了titlePattern.matcher(line)的错误;

你说你的错误发生得更早(实际错误是什么,运行没有错误),但解决之后你需要在匹配器上调用find()一次来实际搜索模式:

 if(titleMatcher.find()){ String title = titleMatcher.group(1); } 

如果您真的匹配具有非转义HTML实体的字符串,请不要这样做

 xyz 

那么你的正则表达式将不得不使用这些,而不是转义的实体:

 "\\s*(.+?)\\s*" 

此外,您应该小心您尝试使用它的程度,因为您无法使用正则表达式真正解析HTML或XML 。 如果您正在使用XML,则使用XML解析器(例如JDOM)要容易得多。

从技术上讲,这不是一个答案,但你不应该使用正则表达式来解析HTML。 你可以尝试,你可以为简单的任务摆脱它,但HTML可以变得丑陋。 有许多Java库可以很好地解析HTML / XML。 如果您要使用HTML / XML进行大量工作,那么值得花时间学习它们。

正如其他人所建议的那样,用正则表达式解析HTML / XML可能不是一个好主意。 您可以使用标准java API解析XML文档,但我不建议这样做。 正如Fabian Steeg已经回答的那样,使用JDOM或类似的开源库来解析XML可能会更好。

使用javax.xml.parsers,您可以执行以下操作:

 String xml = "abc"; 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);