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

求适配多场景的Docker镜像URL JavaScript正则表达式

解决Docker镜像URL匹配的JavaScript正则表达式问题

需求回顾

需要匹配符合Docker镜像命名规范的URL,支持以下场景:

  • Docker Hub镜像(如nginx、username/nginx)
  • 带HTTP/HTTPS前缀的私有仓库镜像(如http://example.example.com/myimage)
  • 带标签/摘要的镜像(如nginx:latest、nginx@sha256:abc123def456...)
  • 特定仓库镜像(如quay.io/username/myimage)
  • 本地镜像(如myimage:latest)

修正后的正则表达式

const dockerImageRegex = /^(?:(?:https?:\/\/)?(?<registry>[\w.-]+(?::\d+)?)(?:\/))?(?:(?<repository>(?:[\w.-]+\/)+))?(?<image>[\w.-]+)(?:(?::(?<tag>[\w.-]{1,127}))|(?<digest>@sha256:[a-f0-9]{64}))?$/i;

验证测试

以下是针对问题场景及其他典型场景的测试结果:

// 原失败场景现在匹配成功
console.log(dockerImageRegex.test('http://example.example.com/ai-ocr:v1')); // true
console.log(dockerImageRegex.test('example.example.com/crazymax/yasu')); // true

// 原正常场景保持匹配成功
console.log(dockerImageRegex.test('example.example.com/face-anonymizer:020921')); // true
console.log(dockerImageRegex.test('example.example.com/operation_service_images/mohammad-mohammad')); // true

// 其他典型场景测试
console.log(dockerImageRegex.test('nginx')); // true
console.log(dockerImageRegex.test('username/nginx')); // true
console.log(dockerImageRegex.test('nginx:latest')); // true
console.log(dockerImageRegex.test('nginx@sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855')); // true
console.log(dockerImageRegex.test('quay.io/username/myimage')); // true
console.log(dockerImageRegex.test('myimage:latest')); // true

正则表达式解析

各部分功能说明:

  • ^(?:(?:https?:\/\/)?(?<registry>[\w.-]+(?::\d+)?)(?:\/))?:
    • 匹配可选的http:///https://前缀
    • 捕获registry地址,支持域名(如docker.io)和带端口的地址(如localhost:5000)
  • (?:(?<repository>(?:[\w.-]+\/)+))?:
    • 捕获可选的多级命名空间(repository),支持username/、a/b/c/这类格式
  • (?<image>[\w.-]+):
    • 捕获必填的镜像名称,支持字母、数字、下划线、点、连字符
  • (?:(?::(?<tag>[\w.-]{1,127}))|(?<digest>@sha256:[a-f0-9]{64}))?$:
    • 匹配可选的tag(长度限制1-127字符,符合Docker规范)或SHA256格式的镜像摘要
  • i标志:忽略大小写,兼容大小写混合的域名或标签

原正则的问题分析

  1. 缺失HTTP/HTTPS前缀支持:原正则未处理以http:///https://开头的registry地址,导致这类URL匹配失败。
  2. 预查断言逻辑错误:原正则中对repository分组使用了(?=\/[a-z0-9._-]+\/[a-z0-9._-]+)正向预查,强制要求registry后必须跟随两级路径,限制了匹配灵活性,导致example.example.com/crazymax/yasu这类合法URL匹配失败。
  3. 未支持镜像摘要:原正则仅覆盖了tag场景,未处理@sha256:...格式的镜像摘要。
  4. 字符范围冗余:原正则部分位置使用[a-z0-9._-],结合i标志可简化为[\w.-],更简洁且覆盖相同字符范围。

内容的提问来源于stack exchange,提问作者Mohammad Javdani

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 23:42:03