【问题标题】:How to use a pattern to get a value between 2 known strings如何使用模式获取 2 个已知字符串之间的值
【发布时间】:2015-09-07 08:51:51
【问题描述】:

首先让我告诉你我来自哪里。我有一个字符串,它是来自网站的 html 代码,我使用 JSOUP 得到了这个。无论如何,html都在字符串中,我可以将它打印到文本文件中。所以我试图从这段代码中获取歌曲,每首歌曲都使用相同的“标签”

这是我打印到的文本文件中的一行

          <div class="title" itemprop="name">
           Wrath
          </div> </td> 

在记事本中它看起来像一条线,但是当您复制并粘贴它时,它看起来像这样。所以我想要的是中间的愤怒,所以我尝试使用其他堆栈帖子的帮助创建一个模式来找到它:Java regex to extract text between tags

这是我的代码中与此有关的部分

Pattern p = Pattern.compile( "<div class=\"title\" itemprop=\"name\">(.+?)</div> </td>");
    Matcher m = p.matcher( html );
    while( m.find()) {
       quote.add( m.group( 1 ));
    }

当它运行时,它显示 ArrayList 引用中没有任何内容。这可能不起作用,因为它计算了两者之间的空间。有什么想法吗?

【问题讨论】:

标签: java html regex


【解决方案1】:

您可以使用jsoup 来解析和下载您的 HTML 文档:

String site = "http://example.com/";
Document doc = Jsoup.connect(site).get();
String text doc.select("div.title").first().text();

如果这不起作用,或者只是使用 XPath。正则表达式非常适合从非结构化文本中提取数据。但是,当您拥有像 HTML 这样的结构化文档时,您可以将所有繁重的工作留给专门构建的解析器。 Java 附带 javax.xml.xpath library,您可以使用它搜索文档的节点树。

假设您的文档如下所示:

<html>
  <body>
    <div class="title">Wrath</div>
  </body>
</html>

您可以这样做来查找该 div 中的文本:

XPath xpath = XPathFactory.newInstance().newXPath();
String expression = "/html/body/div[@class='title']/text()";
InputSource inputSource = new InputSource("myDocument.html");
NodeList nodes = (NodeList) xpath.evaluate(expression, inputSource, XPathConstants.NODESET);

【讨论】:

  • 我不能使用第一部分,因为我不知道 Wrath 已经在里面了,它可以是任何名字。至于您给我的 XPath 代码,我似乎遇到了一些错误,例如 malformedURLexcpetion: no protocol: 然后它会显示文件
  • 我猜你是从某个地方下载网页?在这种情况下,您可以将下载的 String 解析为 JSOUP Document,然后只需使用 doc.select("div.title").text() 即可获取相关文本。
  • 啊!!这在大多数情况下都有效,它得到了所有的歌曲和一些额外的东西。非常感谢!
  • 没问题。我很高兴您找到了解决方案!另外,请仔细查看jsoup documentation。它基于 XPath 库,功能非常强大。
【解决方案2】:

如果它像 Perl 一样解析,您可能需要在 \

上加倍
Pattern p = Pattern.compile("<div class=\"title\" itemprop=\"name\">(.*?)<\\/div>");

应该是

Pattern p = Pattern.compile("<div class=\"title\" itemprop=\"name\">(.*?)<\\\\/div>");

但是对于这种事情,Regex 是错误的工具

【讨论】:

    猜你喜欢
    • 2016-12-04
    • 2010-12-15
    • 1970-01-01
    • 2013-07-25
    • 2013-05-03
    • 2015-02-18
    • 2015-04-01
    • 1970-01-01
    相关资源
    最近更新 更多