regex s3存储桶名称的正则表达式

31moq8wy  于 2023-02-14  发布在  其他
关注(0)|答案(9)|浏览(213)

我尝试通过cloudformation创建一个s3 bucket。我尝试使用regex ^([0-9a-z.-]){3,63}$,但它也接受模式“...”和“---”,根据新的s3命名约定,这是无效的。(参考:https://docs.aws.amazon.com/AmazonS3/latest/dev/BucketRestrictions.html)请帮帮忙?

um6iljoc

um6iljoc1#

答案

    • 最简单和最安全的正则表达式**是:

(?!(^xn--|.+-s3alias$))^[a-z0-9][a-z0-9-]{1,61}[a-z0-9]$
它确保了名称在所有情况下都有效-包括使用S3传输加速时。此外,由于它不包含任何反斜杠,因此在字符串上下文中使用起来更容易。

备选

如果您需要包含点的S3存储桶名称(并且您不使用S3传输加速),则可以使用以下名称:
(?!(^((2(5[0-5]|[0-4][0-9])|[01]?[0-9]{1,2})\.){3}(2(5[0-5]|[0-4][0-9])|[01]?[0-9]{1,2})$|^xn--|.+-s3alias$))^[a-z0-9][a-z0-9.-]{1,61}[a-z0-9]$

解释

截至2022年5月14日的Amazon S3 bucket naming rules为:
1.存储桶名称的长度必须介于3(最少)和63(最多)个字符之间。
1.存储桶名称只能由小写字母、数字、点(.)和连字符(-)组成。
1.存储桶名称必须以字母或数字开头和结尾。
1.存储桶名称不能格式化为IP地址(例如192.168.5.4)。
1.存储桶名称不能以前缀xn--开头。
1.存储桶名称不能以后缀-s3alias结尾。

  1. Amazon S3传输加速使用的存储桶名称中不能包含点(.)。
    此正则表达式匹配所有规则(包括规则7):
    (?!(^xn--|.+-s3alias$))^[a-z0-9][a-z0-9-]{1,61}[a-z0-9]$
    第一个组(?!(^xn--|-s3alias$))是一个负前瞻,确保名称不以xn--开头或以-s3alias结尾(满足规则5和6)。
    表达式^[a-z0-9][a-z0-9-]{1,61}[a-z0-9]$的其余部分确保:
  • 名称以小写字母或数字(^[a-z0-9])开头,并以小写字母或数字([a-z0-9]$)结尾(规则3)。
  • 姓名的其余部分由1至61个小写字母、数字或连字符([a-z0-9-]{1,61})组成(规则2)。
  • 整个表达式匹配长度为3到63个字符的名称(规则1)。

最后,我们不需要担心规则4(它禁止看起来像IP地址的名称),因为规则7通过禁止名称中的点隐含地涵盖了这一点。
如果您使用Amazon S3 Transfer Acceleration,并且希望允许更复杂的存储桶名称,则可以使用以下更复杂的正则表达式:
(?!(^((2(5[0-5]|[0-4][0-9])|[01]?[0-9]{1,2})\.){3}(2(5[0-5]|[0-4][0-9])|[01]?[0-9]{1,2})$|^xn--|.+-s3alias$))^[a-z0-9][a-z0-9.-]{1,61}[a-z0-9]$
主要的变化是添加了匹配IPv4地址的表达式(虽然规范只是简单地说桶名不能格式化为IP地址,因为IPv6地址包含冒号,它们已经被规则2禁止了。)

lawou6xi

lawou6xi2#

以下正则表达式满足AWS规范,前提是您不希望在存储桶名称中使用.(这是一个建议,否则无法启用传输加速):

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

这一个很好,因为它允许合并到更复杂的检查中,只需用其他字符串替换^$,从而允许ARN检查等。
编辑:根据@ryanjdillon的评论添加-s3alias排除

vsikbqxv

vsikbqxv3#

我对Zak的回答做了一些修改,发现它有点太复杂了,并且忽略了有效的域名。下面是新的正则表达式(可以在regex101.com**上测试):

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

第一部分是负前瞻(?!^(\d{1,3}\.){3}\d{1,3}$),它只匹配有效的IP地址,基本上,我们尝试匹配1-3个数字,然后是3次句点(\d{1,3}\.){3}),然后是1-3个数字(\d{1,3})。
第二部分规定名称必须以小写字母或数字开头(^[a-z0-9]),后跟重复0到多次的小写字母、数字或连字符([a-z0-9-]*)。如果有句点,则必须后跟小写字母或数字((\.[a-z0-9])?)。最后两种模式重复0到多次(([a-z0-9-]*(\.[a-z0-9])?)*)。
这个正则表达式不会强制执行AWS规定的长度限制(3-63个字符),这可以通过另一个正则表达式(.{3,6})或检查字符串的长度来处理。

**在这个链接上,我添加的一个测试失败了,但是如果你切换到测试区域并键入相同的模式,它就通过了。如果你将它复制/粘贴到终端中,它也能工作,所以我认为这是www.example.com端的一个bugregex101.com。

ljsrvy3e

ljsrvy3e4#

S3存储桶名称的正则表达式:

String S3_REPORT_NAME_PATTERN = "[0-9A-Za-z!\\-_.*\'()]+";

String S3_PREFIX_PATTERN   = "[0-9A-Za-z!\\-_.*\\'()/]*";

String S3_BUCKET_PATTERN = "(?=^.{3,63}$)(?!^(\\d+\\.)+\\d+$)(^(([a-z0-9]|[a-z0-9][a-z0-9\\-]*[a-z0-9])\\.)*([a-z0-9]|[a-z0-9][a-z0-9\\-]*[a-z0-9])$)";
t40tm48m

t40tm48m5#

我使用了@Zak regex,但它不是100%正确。我使用this作为AWS bucket name的所有规则。我一步一步地进行验证,结果如下所示:

  • 存储桶名称的长度必须至少为3个字符且不超过63个字符-〉^.{3,63}$
  • 存储桶名称不能包含大写字符或下划线-〉[A-Z_]
  • 存储桶名称必须以小写字母或数字开头-〉^[a-z0-9]
  • 存储桶名称的格式不能为IP地址(例如192.168.5.4)-〉^(\d+\.)+\d+$。这比AWS更严格。
  • 存储桶名称必须是一个或多个标签的序列。相邻标签由单个句点(.)分隔-〉在python if ".." in bucket_name:
  • ..每个标签必须以小写字母或数字-〉^(.*[a-z0-9]\.)*.*[a-z0-9]$结尾
7fyelxc5

7fyelxc56#

var bucketRGEX =  new RegExp(/(?=^.{3,63}$)/);
var bucketRGEX1 =  new RegExp(/(?!^(\d+\.)+\d+$)/);
var bucketRGEX2 =  new RegExp(/(^(([a-z0-9]|[a-z0-9][a-z0-9\-]*[a-z0-9])\.)*([a-z0-9]|[a-z0-9][a-z0-9\-]*[a-z0-9])$)/);
var result = bucketRGEX.test(bucketName);
var result1 = bucketRGEX1.test(bucketName);
var result2 = bucketRGEX2.test(bucketName);
console.log('bucketName '+bucketName +' result '+result);
console.log('bucketName '+bucketName +' result1 '+result1);
console.log('bucketName '+bucketName +' result 2 '+result2);

if(result && result1 && result2)
{
  //condition pass
}
else
{
    //not valid bucket name
}
kfgdxczn

kfgdxczn7#

AWS发布了新的指导方针,其中'.'被认为是不推荐的,并且以'xn--'开头的存储桶名称现在被禁止(https://docs.aws.amazon.com/AmazonS3/latest/dev/BucketRestrictions.html)。如果您不允许'.',正则表达式将变得更加可读:
(?=^.{3,63}$)(?!xn--)([a-z0-9](?:[a-z0-9-]*)[a-z0-9])$

ddarikpa

ddarikpa8#

我试着传递一个错误的桶名给API本身,看看它是如何验证的。看起来下面是API响应中返回的有效正则表达式模式。
存储桶名称必须与正则表达式匹配

^[a-zA-Z0-9.\-_]{1,255}$

或者是与正则表达式匹配的ARN

^arn:(aws).*:(s3|s3-object-lambda):[a-z\-0-9]+:[0-9]{12}:accesspoint[/:][a-zA-Z0-9\-]{1,63}$|^arn:(aws).*:s3-outposts:[a-z\-0-9]+:[0-9]{12}:outpost[/:][a-zA-Z0-9\-]{1,63}[/:]accesspoint[/:][a-zA-Z0-9\-]{1,63}$
q7solyqu

q7solyqu9#

    • 编辑:**修改了正则表达式以允许所需的大小(3 - 63)并添加了一些其他选项。

名称必须符合DNS,因此您可以尝试:

^[A-Za-z0-9][A-Za-z0-9\-]{1,61}[A-Za-z0-9]$

参见:https://regexr.com/3psne
如果需要使用句点,请使用此选项:

^[A-Za-z0-9][A-Za-z0-9\-.]{1,61}[A-Za-z0-9]$

参见:https://regexr.com/3psnb
最后,如果你想禁止两个连续的"非单词"字符,你可以使用:

^[A-Za-z0-9](?!.*[.-]{2})[A-Za-z0-9\-.]{1,61}[A-Za-z0-9]$

参见:https://regexr.com/3psn8
基于:Regexp for subdomain

相关问题