Azure 容器名称正则表达式

Azure Container Name RegEx

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

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

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

test--test 

规则是:

如果您按照自己习惯的方式解决问题,可以使用

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

regex demo

如果字符串中有 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]+)*$
 ^^^^^^^^^^^^

此正则表达式是答案顶部正则表达式的 "synonym"。

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

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

如果名称无效,则此方法抛出 ArgumentException。正如您从名称中猜到的那样,此静态 class 包含用于验证队列、表、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://docs.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
    }
}