You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java正则表达式提取URL中/DevDOC/至.pdf的子串问题

问题:提取URL中/DevDOC/....../.pdf格式的片段

我已查阅StackOverflow上所有相关问题,但未找到完美解决方案,特求助。需要从以下三种不同格式的URL字符串中提取**/DevDOC/....../.pdf**格式的片段:

示例URL

  1. HTML转义后的链接:
<p><a href='https://abcd.com/sites/WG-ProductManagementTeam/FunctionalSpecs/Forms/AllItems.aspx?id=/sites/WG-ProductManagementTeam/FunctionalSpecs/DevDOC/Enhancements to PA Peer Checklist/PA Peer Checklist (V2.3) -v10.0.pdf&parent=/sites/WG-ProductManagementTeam/FunctionalSpecs/DevDOC/Enhancements to PA Peer Checklist&p=true&ga=1'>WG-Product Management Team - PA Peer Checklist (V2.3) -v10.0.pdf - All Documents (sharepoint.com)</a></p>
  1. URL编码后的完整链接:
https://abcd.com/sites/WG-ProductManagementTeam/FunctionalSpecs/Forms/AllItems.aspx?id=%2Fsites%2FWG%2DProductManagementTeam%2FFunctionalSpecs%2FDevDOC%2FEnhancements%20to%20PA%20Peer%20Checklist%2FPA%20Peer%20Checklist%20%28V2%2E3%29%20%2Dv10%2E0%2Epdf&parent=%2Fsites%2FWG%2DProductManagementTeam%2FFunctionalSpecs%2FDevDOC%2FEnhancements%20to%20PA%20Peer%20Checklist&p=true&ga=1
  1. SharePoint直接链接:
https://abcd.com/:b:/r/sites/WG-ProductManagementTeam/FunctionalSpecs/DevDOC/Enhancements%20to%20PA%20Peer%20Checklist/PA%20Peer%20Checklist%20(v2.0)%20-%20v3.0.pdf?csf=1&web=1&e=txs2Yq

当前问题

我使用正则表达式".*/FunctionalSpecs(?!.*\1)(.*?)(.pdf)"时,示例2和3能正确提取,但示例1会错误返回:

/DevDOC/Enhancements to PA Peer Checklist&p=true&ga=1'>WG-Product Management Team - PA Peer Checklist (V2.3) -v10.0.pdf

期望结果应为:

/DevDOC/Enhancements to PA Peer Checklist/PA Peer Checklist (V2.3) -v10.0.pdf

解决方案(Java适配)

使用以下正则表达式可以适配所有三种格式:

String regex = "/DevDOC/[^&?'<>]*\\.pdf";

正则说明

  • /DevDOC/:匹配目标片段的起始标识
  • [^&?'<>]*:匹配任意数量的非分隔符字符(排除URL参数分隔符&、?,以及HTML标签的'、<、>),避免错误匹配后续的参数或HTML内容
  • \\.pdf:匹配片段结尾的.pdf(Java中需转义反斜杠,所以写为\\.)

使用示例(Java代码)

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class UrlExtractor {
    public static void main(String[] args) {
        String regex = "/DevDOC/[^&?'<>]*\\.pdf";
        Pattern pattern = Pattern.compile(regex);
        
        // 示例1:HTML转义字符串
        String htmlStr = "&lt;p&gt;&lt;a href='https://abcd.com/sites/WG-ProductManagementTeam/FunctionalSpecs/Forms/AllItems.aspx?id=/sites/WG-ProductManagementTeam/FunctionalSpecs/DevDOC/Enhancements to PA Peer Checklist/PA Peer Checklist (V2.3) -v10.0.pdf&amp;amp;parent=/sites/WG-ProductManagementTeam/FunctionalSpecs/DevDOC/Enhancements to PA Peer Checklist&amp;amp;p=true&amp;amp;ga=1'&gt;WG-Product Management Team - PA Peer Checklist (V2.3) -v10.0.pdf - All Documents (sharepoint.com)&lt;/a&gt;&lt;/p&gt;";
        Matcher matcher1 = pattern.matcher(htmlStr);
        if (matcher1.find()) {
            System.out.println("示例1提取结果:" + matcher1.group());
        }
        
        // 示例2:URL编码字符串
        String urlEncodedStr = "https://abcd.com/sites/WG-ProductManagementTeam/FunctionalSpecs/Forms/AllItems.aspx?id=%2Fsites%2FWG%2DProductManagementTeam%2FFunctionalSpecs%2FDevDOC%2FEnhancements%20to%20PA%20Peer%20Checklist%2FPA%20Peer%20Checklist%20%28V2%2E3%29%20%2Dv10%2E0%2Epdf&amp;parent=%2Fsites%2FWG%2DProductManagementTeam%2FFunctionalSpecs%2FDevDOC%2FEnhancements%20to%20PA%20Peer%20Checklist&amp;p=true&amp;ga=1";
        Matcher matcher2 = pattern.matcher(urlEncodedStr);
        if (matcher2.find()) {
            System.out.println("示例2提取结果:" + matcher2.group());
        }
        
        // 示例3:SharePoint直接链接
        String spUrl = "https://abcd.com/:b:/r/sites/WG-ProductManagementTeam/FunctionalSpecs/DevDOC/Enhancements%20to%20PA%20Peer%20Checklist/PA%20Peer%20Checklist%20(v2.0)%20-%20v3.0.pdf?csf=1&amp;web=1&amp;e=txs2Yq";
        Matcher matcher3 = pattern.matcher(spUrl);
        if (matcher3.find()) {
            System.out.println("示例3提取结果:" + matcher3.group());
        }
    }
}

额外优化(可选)

如果需要将URL编码的字符(如%20、%28)还原为原始字符,可以在提取后使用URLDecoder.decode():

import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;

// 提取后解码
String extracted = matcher1.group();
String decoded = URLDecoder.decode(extracted, StandardCharsets.UTF_8);
System.out.println("解码后结果:" + decoded);

内容的提问来源于stack exchange,提问作者Faizan Shaikh Sarkar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 04:01:39