Java正则表达式提取URL中/DevDOC/至.pdf的子串问题
问题:提取URL中
/DevDOC/....../.pdf格式的片段 我已查阅StackOverflow上所有相关问题,但未找到完美解决方案,特求助。需要从以下三种不同格式的URL字符串中提取**/DevDOC/....../.pdf**格式的片段:
示例URL
- 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&amp;parent=/sites/WG-ProductManagementTeam/FunctionalSpecs/DevDOC/Enhancements to PA Peer Checklist&amp;p=true&amp;ga=1'>WG-Product Management Team - PA Peer Checklist (V2.3) -v10.0.pdf - All Documents (sharepoint.com)</a></p>
- 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
- 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 = "<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&amp;parent=/sites/WG-ProductManagementTeam/FunctionalSpecs/DevDOC/Enhancements to PA Peer Checklist&amp;p=true&amp;ga=1'>WG-Product Management Team - PA Peer Checklist (V2.3) -v10.0.pdf - All Documents (sharepoint.com)</a></p>"; 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&parent=%2Fsites%2FWG%2DProductManagementTeam%2FFunctionalSpecs%2FDevDOC%2FEnhancements%20to%20PA%20Peer%20Checklist&p=true&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&web=1&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
相关产品推荐
相关产品推荐

