如何用正则表达式匹配URL中的DOI并排除末尾标记?
从URL中提取DOI的正则优化方案
针对你遇到的两个匹配问题,我们可以通过**负前瞻(Negative Lookahead)**精准控制匹配范围,修正后的正则表达式如下:
10\.\d{4,9}\/(?:(?!\.(full-text|pdf|full\.pdf)|\/meta)[-.;():\w\/<>])+
核心问题解决解析
1. 排除.full-text等后缀
正则中的(?!\.(full-text|pdf|full\.pdf))是负前瞻断言,它会检查当前匹配位置的后方不能紧跟.full-text、.pdf或.full.pdf这类后缀。当匹配到这些后缀的起始点时,正则会自动停止,从而截断掉不需要的后缀部分。
- 例如处理
url/10.1010/2024.01.01.123v1.full-text时,会匹配到10.1010/2024.01.01.123v1,不会包含.full-text。
2. 排除/meta等后续路径
(?!\/meta)同样是负前瞻断言,它会阻止正则匹配到/meta及其前面的斜杠。当DOI后跟着/meta这类额外路径时,正则会在/meta之前停止匹配,保留完整的DOI主体。
- 例如处理
url/10.1010/123-456/abc123/meta时,会匹配到10.1010/123-456/abc123,自动排除后续的/meta。
正则细节补充
- 扩展了字符集,加入
\/和<>,确保能匹配包含斜杠、尖括号的合法DOI(比如测试用例中的10.1010/(ABC)123-123(123)123:1<123::abc-1a>1.0.ab;2-a)。 - 使用非捕获组
(?:...)包裹核心匹配逻辑,避免生成不必要的捕获组,提升匹配效率。若需排除更多自定义路径,直接在负前瞻中添加\/自定义路径即可(比如\/some-long-extra-words)。
测试用例验证
所有测试用例均能得到预期结果:
url/bar:无匹配结果 ✔️url/10.1010/abc123:匹配10.1010/abc123✔️url/10.1010/2024.01.01.123v1:匹配10.1010/2024.01.01.123v1✔️url/10.1010/2024.01.01.123v1.full-text:匹配10.1010/2024.01.01.123v1✔️url/10.1010/123456-2/some-long-extra-words:匹配10.1010/123456-2✔️url/10.1010/123-456/abc123/meta:匹配10.1010/123-456/abc123✔️url/10.1010/abc123abc.pdf:匹配10.1010/abc123abc✔️url/10.1010/a.bc.2024.01.001:匹配10.1010/a.bc.2024.01.001✔️url/10.1010/abc.2024.00001:匹配10.1010/abc.2024.00001✔️url/10.1010/abc-2024-abc123-v1:匹配10.1010/abc-2024-abc123-v1✔️url/10.1010/2024.01.01.123.full.pdf:匹配10.1010/2024.01.01.123✔️url/10.1010/(ABC)123-123(123)123:1<123::abc-1a>1.0.ab;2-a:匹配10.1010/(ABC)123-123(123)123:1<123::abc-1a>1.0.ab;2-a✔️
内容的提问来源于stack exchange,提问作者Intrastellar Explorer
相关产品推荐
相关产品推荐

