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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:52:57