如何在Node.js/JavaScript中解析Azure Blob URI并提取信息?
解析Azure Blob URI并验证有效性(Node.js)
我之前也碰到过类似的需求——Azure的Node SDK确实没有提供直接解析Blob URI的工具方法,所以用正则表达式来实现是个靠谱的解决方案。下面是我整理的完整实现,能覆盖你提到的所有URI场景,还包含了符合Azure规范的有效性校验:
正则表达式设计
我们需要匹配Blob URI的核心组成部分:可选的HTTP/HTTPS协议、存储账户名、Blob服务域名、容器名(含$root或隐含情况)以及Blob路径。对应的正则如下:
const blobUriRegex = /^https?:\/\/([a-z0-9]+)\.blob\.core\.windows\.net(?:\/([^/]+))?(?:\/(.*))?$/i;
小说明:
- 用
i标志忽略输入的大小写,之后会把账户名和容器名统一转成小写(因为Azure存储账户/容器名实际是区分大小写的,且要求小写)- 第一个捕获组提取存储账户名,第二个是容器名(可选),第三个是Blob名称(可选)
完整解析函数
这个函数不仅能解析URI,还会校验存储账户和容器的命名是否符合Azure的规则:
function parseAzureBlobUri(uri) { const regex = /^https?:\/\/([a-z0-9]+)\.blob\.core\.windows\.net(?:\/([^/]+))?(?:\/(.*))?$/i; const matches = uri.match(regex); if (!matches) { return { valid: false, error: "Invalid Azure Blob URI format" }; } const accountName = matches[1].toLowerCase(); let containerName = matches[2]; let blobName = matches[3] || ""; // 校验存储账户名:必须是3-24位的小写字母+数字 const accountNamePattern = /^[a-z0-9]{3,24}$/; if (!accountNamePattern.test(accountName)) { return { valid: false, error: "Invalid storage account name. Must be 3-24 characters, lowercase letters and numbers only." }; } // 处理隐含的$root容器:如果URI里没指定容器,默认就是$root if (!containerName) { containerName = "$root"; // 没容器也没Blob的话,不是有效的Blob URI if (!blobName) { return { valid: false, error: "URI does not specify a Blob" }; } } else { // 校验容器名规则:3-63位,仅小写字母、数字、短横线,不能以短横线开头/结尾 const containerNamePattern = /^[a-z0-9](?:[a-z0-9-]{1,61}[a-z0-9])?$/; if (!containerNamePattern.test(containerName.toLowerCase())) { return { valid: false, error: "Invalid container name. Must be 3-63 characters, lowercase letters, numbers, and hyphens only. Cannot start or end with a hyphen." }; } // 显式指定$root容器但没Blob的情况 if (containerName.toLowerCase() === "$root" && !blobName) { return { valid: false, error: "URI does not specify a Blob in $root container" }; } } return { valid: true, accountName, containerName: containerName.toLowerCase(), blobName }; }
测试你的示例URI
用你给出的三个例子测试一下,结果如下:
// 示例1:标准容器+Blob console.log(parseAzureBlobUri("https://myaccount.blob.core.windows.net/mycontainer/myblob")); // 输出:{ valid: true, accountName: 'myaccount', containerName: 'mycontainer', blobName: 'myblob' } // 示例2:隐含$root容器的Blob console.log(parseAzureBlobUri("http://myaccount.blob.core.windows.net/myblob")); // 输出:{ valid: true, accountName: 'myaccount', containerName: '$root', blobName: 'myblob' } // 示例3:显式$root容器的Blob console.log(parseAzureBlobUri("https://myaccount.blob.core.windows.net/$root/myblob")); // 输出:{ valid: true, accountName: 'myaccount', containerName: '$root', blobName: 'myblob' }
如果遇到无效的URI(比如账户名不符合规则、缺少Blob路径等),函数会返回带错误信息的结果,方便你做后续处理。
扩展提示
如果需要支持带SAS令牌的Blob URI,可以修改正则表达式,忽略?之后的参数部分,比如把正则改成:
const blobUriRegex = /^https?:\/\/([a-z0-9]+)\.blob\.core\.windows\.net(?:\/([^/]+))?(?:\/(.*))?(?:\?.*)?$/i;
内容的提问来源于stack exchange,提问作者Martinsos
相关产品推荐
相关产品推荐

