如何编写Java正则表达式匹配三个链接并提取指定内容
Java正则匹配三个链接并提取目标日期字符串
需求说明
我之前实现了匹配两个特定下载链接的Java正则,现在需要扩展为匹配三个链接,并分别提取每个链接中的目标日期字符串:
- 链接1:
https://downloads.test.test.testagain.tes/test-test/test/te25st24w/te43s5t25x/0twt42ts/test0218.pdf→ 提取0218 - 链接2:
https://downloads.test.test.testagain.tes/test-test/test/te25st24w/te43s5t25x/0twt42ts/TestTes-09-05-2018.pdf→ 提取09-05-2018 - 链接3:
https://downloads.test.test.testagain.tes/test-test/test/te25st24w/te43s5t25x/0twt42ts/01-01-18_Testt_Testing_ASB_Test_Final.pdf→ 提取01-01-18
原有正则代码:
String REGEX_LINK = "https:..downloads.test.test.testagain.tes.test-test.test."; Pattern pattern = Pattern.compile( REGEX_LINK + ".[\\w*/]*.((\\d{2}-\\d{2}-)?\\d{4}).pdf" );
解决方案
调整正则以覆盖三种日期格式,同时修正原有正则的转义问题(原代码中的.未转义会匹配任意字符,导致匹配范围过大):
最终实现代码
// 固定前缀部分,修正转义符确保匹配实际的域名和路径 String REGEX_PREFIX = "https://downloads\\.test\\.test\\.testagain\\.tes/test-test/test/te25st24w/te43s5t25x/0twt42ts/"; // 核心正则:捕获三种日期格式,使用非贪婪匹配避免过度匹配 Pattern pattern = Pattern.compile(REGEX_PREFIX + ".*?((?:\\d{2}-\\d{2}-)?(?:\\d{4}|\\d{2})).*?\\.pdf"); // 测试三个目标链接 String[] targetLinks = { "https://downloads.test.test.testagain.tes/test-test/test/te25st24w/te43s5t25x/0twt42ts/test0218.pdf", "https://downloads.test.test.testagain.tes/test-test/test/te25st24w/te43s5t25x/0twt42ts/TestTes-09-05-2018.pdf", "https://downloads.test.test.testagain.tes/test-test/test/te25st24w/te43s5t25x/0twt42ts/01-01-18_Testt_Testing_ASB_Test_Final.pdf" }; for (String link : targetLinks) { Matcher matcher = pattern.matcher(link); if (matcher.find()) { System.out.println("提取结果:" + matcher.group(1)); } }
正则逻辑拆解
- 前缀部分:将原有的模糊匹配
https:..修正为精确转义的域名路径https://downloads\\.test\\.test\\.testagain\\.tes/...,避免误匹配其他无关链接。 - 核心捕获组:
((?:\\d{2}-\\d{2}-)?(?:\\d{4}|\\d{2}))(?:\\d{2}-\\d{2}-)?:可选的MM-DD-前缀,使用非捕获组(?:...)减少不必要的分组(?:\\d{4}|\\d{2}):匹配四位数字(0218或2018)或两位数字(18),同样用非捕获组优化
- 非贪婪匹配:
.*?确保匹配到日期后立即停止,不会跳过目标日期去匹配后续的无关字符。
运行输出
提取结果:0218 提取结果:09-05-2018 提取结果:01-01-18
内容的提问来源于stack exchange,提问作者Vitalii Sumka
相关产品推荐
相关产品推荐

