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
规则是:
- 3 到 63 个字符;
- 以字母或数字开头;
- 包含字母、数字和破折号(
-
);
- 每个破折号 (
-
) 的前后必须紧跟一个字母或数字
如果您按照自己习惯的方式解决问题,可以使用
^[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]+)*$
^^^^^^^^^^^^
此正则表达式是答案顶部正则表达式的 "synonym"。
如果您需要不同的 ArgumentException
s 来表示不同的问题,您应该使用 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
}
}
如何使用正则表达式验证 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
规则是:
- 3 到 63 个字符;
- 以字母或数字开头;
- 包含字母、数字和破折号(
-
); - 每个破折号 (
-
) 的前后必须紧跟一个字母或数字
如果您按照自己习惯的方式解决问题,可以使用
^[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]+)*$
^^^^^^^^^^^^
此正则表达式是答案顶部正则表达式的 "synonym"。
如果您需要不同的 ArgumentException
s 来表示不同的问题,您应该使用 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
}
}