如何在java中使用Pattern matcher?

时间:2009-12-31 16:32:31

标签: java regex

我们可以说字符串为<title>xyz</title> 我想从字符串中提取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);

的错误

3 个答案:

答案 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);