J'essaie de créer un bucket s3 via cloudformation. J'ai essayé d'utiliser regex ^ ([0-9a-z .-]) {3,63} $, mais il accepte également les modèles "..." et "---" qui ne sont pas valides selon les nouvelles conventions de dénomination s3. (Réf: https://docs.aws.amazon.com/AmazonS3/ latest / dev / BucketRestrictions.html) Veuillez aider?

5
user4108565 23 mai 2018 à 09:06

5 réponses

Meilleure réponse

Les spécifications sont un peu déroutantes, mais les principaux critères semblent être les suivants:

  • Les noms de compartiment doivent comporter au moins 3 et pas plus de 63 caractères.
  • Les noms de compartiment doivent être une série d'une ou plusieurs étiquettes.
  • Les noms de compartiment peuvent contenir des lettres minuscules, des chiffres et des traits d'union.
  • Chaque étiquette doit commencer et se terminer par une lettre minuscule ou un chiffre.
  • Les étiquettes adjacentes sont séparées par un seul point (.)
  • Les noms de compartiment ne doivent pas être formatés en tant qu'adresse IP (par exemple, 192.168.5.4)

Si tel est le cas, cette expression régulière doit correspondre:

(?=^.{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])$)

Le premier groupe (?=^.{3,63}$) regarde devant pour s'assurer que la correspondance comporte entre 3 et 63 caractères.

Le groupe suivant (?!^(\d+\.)+\d+$) se prépare à interdire les noms de bucket qui ressemblent à des adresses IP.

Le dernier groupe (^(([a-z0-9]|[a-z0-9][a-z0-9\-]*[a-z0-9])\.)*([a-z0-9]|[a-z0-9][a-z0-9\-]*[a-z0-9])$) correspond à zéro ou plusieurs libellés suivis d'un point (([a-z0-9]|[a-z0-9][a-z0-9\-]*[a-z0-9])\.)*, suivi exactement d'un libellé ([a-z0-9]|[a-z0-9][a-z0-9\-]*[a-z0-9]).

12
Zak 29 mai 2018 à 07:09

J'ai un peu adapté la réponse de Zak. J'ai trouvé que c'était un peu trop compliqué et j'ai jeté les noms de domaine valides. Voici la nouvelle regex (disponible avec des tests sur regex101.com **):

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

La première partie est la recherche négative (?!^(\d{1,3}\.){3}\d{1,3}$), qui ne correspond qu'aux adresses IP valides. Fondamentalement, nous essayons de faire correspondre 1 à 3 nombres suivis d'une période 3 fois (\d{1,3}\.){3}) suivie de 1 à 3 nombres (\d{1,3}).

La deuxième partie indique que le nom doit commencer par une lettre minuscule ou un nombre (^[a-z0-9]) suivi de lettres minuscules, de chiffres ou de traits d'union répétés de 0 à plusieurs fois ([a-z0-9-]*). S'il y a un point, il doit être suivi d'une lettre minuscule ou d'un chiffre ((\.[a-z0-9])?). Ces 2 derniers modèles sont répétés de 0 à plusieurs fois (([a-z0-9-]*(\.[a-z0-9])?)*).

L'expression régulière ne tente pas d'appliquer les restrictions de taille définies par AWS (3 à 63 caractères). Cela peut être géré par une autre expression régulière (.{3,6}) ou en vérifiant la taille de la chaîne.


** À ce lien, l'un des tests que j'ai ajoutés échoue, mais si vous passez à la zone de test et tapez le même modèle, il réussit. Cela fonctionne également si vous le copiez / collez dans le terminal, donc je suppose que c'est un bogue du côté de regex101.com.

3
c1moore 5 oct. 2019 à 13:14

Modifier: Modification de l'expression rationnelle pour autoriser la taille requise (3-63) et ajouter d'autres options.

Les noms doivent être compatibles DNS, vous pouvez donc essayer avec:

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

Voir: https://regexr.com/3psne

Utilisez ceci si vous avez besoin d'utiliser des règles:

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

Voir: https://regexr.com/3psnb

Enfin, si vous souhaitez interdire deux caractères 'non-mots' consécutifs, vous pouvez utiliser:

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

Voir: https://regexr.com/3psn8

Basé sur: Regexp pour le sous-domaine

0
Julio 23 mai 2018 à 07:41
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
}  
1
Sunil Jakhar 16 nov. 2018 à 14:13

Expression régulière pour le nom du compartiment 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])$)";
2
ManojP 13 mars 2019 à 09:41