Azure 容器名称 RegEx

本文关键字:RegEx Azure | 更新日期: 2023-09-27 18:32:40

如何使用正则表达式验证 Azure 容器名称?我从其他帖子中找到了以下代码行,但它没有验证连续的破折号 (-)。

if (!Regex.IsMatch(containerName, @"^[a-z0-9](([a-z0-9'-[^'-])){1,61}[a-z0-9]$"))
 throw new Exception("Invalid container name);

例如,以下字符串在上述正则表达式模式下被认为是有效的:

test--test 

规则是:

  • 3 到 63 个字符;
  • 以字母或数字开头;
  • 包含字母、数字和短划线 ( - );
  • 每个破折号(-)必须在紧跟字母或数字的前后

Azure 容器名称 RegEx

如果您按照自定义方法解决问题,则可以使用

^[a-z0-9](?!.*--)[a-z0-9-]{1,61}[a-z0-9]$

查看正则表达式演示

如果字符串中有 2 个连续的连字符,则(?!.*--)前瞻将使匹配失败。

现在,说到Microsoft.WindowsAzure.Storage.NameValidator.ValidateContainerName(string containerName):代码只是重复上述正则表达式的逻辑,每个问题都有单独的参数例外

private const int ContainerShareQueueTableMinLength = 3;
private const int ContainerShareQueueTableMaxLength = 63;

这两行设置容器名称的最小和最大长度,并在 private static void ValidateShareContainerQueueHelper(string resourceName, string resourceType) 方法中进行检查。那里使用的正则表达式是

private static readonly Regex ShareContainerQueueRegex = 
    new Regex("^[a-z0-9]+(-[a-z0-9]+)*$", NameValidator.RegexOptions);

因此,如果您向其添加长度限制,则只需要此模式:

^(?=.{3,63}$)[a-z0-9]+(-[a-z0-9]+)*$
 ^^^^^^^^^^^^

这个正则表达式是答案顶部的"同义词"。

如果需要不同的ArgumentException来指示不同的问题,则应使用NameValidator方法。否则,您可以使用您的单正则表达式解决方案。

我知道这不是你所要求的,但你可以使用存储在存储客户端库中的方法,而不是滚动你自己的正则表达式:Microsoft.Azure.Storage.NameValidator.ValidateContainerName(myContainerName)

如果名称无效,则此方法将引发ArgumentException。 正如您从名称中猜到的那样,此静态类包含用于验证队列、表、blob、目录等名称的方法。

在Powershell中,你可以这样做:

function Test-ContainerNameValidity($ContainerName)
{
    Import-Module -Name AzureRM
    Write-Host "Testing container name against Microsoft's naming rules."
    try {
        [Microsoft.WindowsAzure.Storage.NameValidator]::ValidateContainerName($ContainerName)
        Write-Host -ForegroundColor Green "Container name is valid!"
        return
    }
    catch {
        Write-Host -ForegroundColor Red "Invalid container name. Please check the container name rules: https://learn.microsoft.com/en-us/rest/api/storageservices/naming-and-referencing-containers--blobs--and-metadata#container-names"
        Write-Host -ForegroundColor Red "The script is now exiting."
        exit
    }
}