【问题标题】:How can I adjust this regex to filter out "如何调整此正则表达式以过滤掉“
【发布时间】:2013-11-13 13:27:46
【问题描述】:

我得到以下正则表达式来搜索页面中的视频链接

(http(s?):/)(/[^/]+)\\S+.\\.(?:avi|flv|mp4)

不幸的是,如果后面有另一个匹配项,例如这个视频链接,它不会在链接末尾停止

<a href="http://somevideo.flv">somevideoname.avi</a>

在正则表达式之后会返回这个:

http://somevideo.flv">somevideoname.avi

如何调整正则表达式以避免这种情况?我想了解更多关于正则表达式的知识,它很迷人但又很复杂!

【问题讨论】:

  • 您想只查找来自&lt;a href=".."&gt; 的链接,还是查找来自&lt;span&gt;http://someMovie.flv&lt;/span&gt; 等文本内容的链接?
  • 那么正则表达式不是正确的工具。您应该使用 HTML 解析器,例如 JSoup。

标签: java html regex hyperlink


【解决方案1】:

我不确定我是否理解您的正则表达式中的分组。无论如何,这个应该可以工作:

\\bhttps?://[^\"]+?\\.(?:avi|flv|mp4)\\b

【讨论】:

  • 这也会在&lt;a href="http://someMovie1.avi"&gt;link1&lt;/a&gt;&lt;span&gt;http://someMovie2.mp4&lt;/span&gt;中找到http://someMovie2.mp4
  • 我的错,第二组有一个最大匹配。完全重写了正则表达式。
【解决方案2】:

如果您只想提取 href 属性值,那么您最好匹配以下模式:

href=("|')(.*?)\.(avi|flv|mp4)\1

这应该匹配 "href" 后跟双引号或单引号字符,然后捕获直到(包括)与起始引号字符匹配的下一个字符为止的所有内容。然后你的 href 属性可以被提取出来

matcher.group(2) + "." + matcher.group(3)

用句点和文件扩展名连接文件路径和名称。

【讨论】:

    【解决方案3】:

    你的正则表达式很贪心:

    限制它的贪婪read this:

    (http(s?):/)(/[^/]+?)\\S+.\\.(?:avi|flv|mp4)
    

    【讨论】:

      【解决方案4】:

      以下是使用 JSoup 解析器执行类似操作的方法。

      Scanner scanner = new Scanner(new File("input.txt"));
      scanner.useDelimiter("\\Z");
      String htmlString = scanner.next();
      scanner.close();
      
      Document doc = Jsoup.parse(htmlString);
      // or to get connect of some page use
      // Document doc = Jsoup.connect("http://example.com/").get();
      Elements elements = doc.select("a[href]");//find all anchors with href attribute
      for (Element el : elements) {
          URL url = new URL(el.attr("href"));
          if (url.getPath().matches(".*\\.(?:avi|flv|mp4)")) {
              System.out.println("url: " + url);
              //System.out.println("file: " + url.getPath());
              System.out.println("file name: "
                      + new File(url.getPath()).getName());
              System.out.println("------");
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2010-12-18
        • 1970-01-01
        • 1970-01-01
        • 2022-10-04
        • 2012-11-03
        • 2013-08-31
        • 1970-01-01
        • 1970-01-01
        • 2020-09-13
        相关资源
        最近更新 更多