94 votes

Expression régulière pour valider le nom d'utilisateur

J'essaie de créer une expression régulière pour valider les noms d'utilisateur en fonction de ces critères :

  1. Ne contient que alphanumérique des personnages, soulignement y point .
  2. L'underscore et le point ne peuvent pas être à la même place. fin ou commencer d'un nom d'utilisateur (par exemple _username / username_ / .username / username. ).
  3. Le soulignement et le point ne peuvent pas être à côté l'un de l'autre (par exemple user_.name ).
  4. L'underscore ou le point ne peuvent pas être utilisés plusieurs fois. d'affilée (par exemple user__name / user..name ).
  5. Le nombre de caractères doit être compris entre 8 et 20.

C'est ce que j'ai fait jusqu'à présent ; il semble qu'il applique toutes les règles de critères. mais la 5e règle . Je ne sais pas comment ajouter la 5e règle à cela :

 ^[a-zA-Z0-9]+([._]?[a-zA-Z0-9]+)*$

373voto

Ωmega Points 17702
^(?=.{8,20}$)(?![_.])(?!.*[_.]{2})[a-zA-Z0-9._]+(?<![_.])$

                                                no _ or . at the end

                                     allowed characters

                         no __ or _. or ._ or .. inside

                no _ or . at the beginning

       username is 8-20 characters long

Si votre navigateur génère une erreur en raison de l'absence de prise en charge du look-behind négatif, utilisez le modèle alternatif suivant :

^(?=[a-zA-Z0-9._]{8,20}$)(?!.*[_.]{2})[^_.].*[^_.]$

15voto

PhilMasterG Points 2188

Je suppose qu'il faut utiliser les expressions Lookahead ici. http://www.regular-expressions.info/lookaround.html

Essayez

^[a-zA-Z0-9](_(?!(\.|_))|\.(?!(_|\.))|[a-zA-Z0-9]){6,18}[a-zA-Z0-9]$

[a-zA-Z0-9] un alphanumérique THEN (

_(?!\.) un _ non suivi d'un . OU

\.(?!_) a . non suivi d'un _ OU

[a-zA-Z0-9] un caractère alphanumérique ) POUR

{6,18} minimum 6 à maximum 18 fois ALORS

[a-zA-Z0-9] un caractère alphanumérique

(Le premier caractère est un alphanum, puis 6 à 18 caractères, le dernier caractère est un alphanum, 6+2=8, 18+2=20)

14voto

James Kyburz Points 4352

Même si j'adore les expressions régulières, je pense qu'il y a une limite à ce qui est lisible

Je suggère donc

new Regex("^[a-z._]+$", RegexOptions.IgnoreCase).IsMatch(username) &&
!username.StartsWith(".") &&
!username.StartsWith("_") &&
!username.EndsWith(".") &&
!username.EndsWith("_") &&
!username.Contains("..") &&
!username.Contains("__") &&
!username.Contains("._") &&
!username.Contains("_.");

C'est plus long mais le responsable n'aura pas besoin d'ouvrir expresso pour comprendre.

Bien sûr, vous pouvez commenter une longue regex, mais la personne qui la lira devra se fier à l'adresse ........

8voto

Patrick McDonald Points 20645

Une légère modification de la réponse de Phillip corrige la dernière exigence.

^[a-zA-Z0-9]([._](?![._])|[a-zA-Z0-9]){6,18}[a-zA-Z0-9]$

3voto

isurie Points 31
private static final Scanner scan = new Scanner(System.in);

public static void main(String[] args) {
    int n = Integer.parseInt(scan.nextLine());
    while (n-- != 0) {
        String userName = scan.nextLine();
        String regularExpression = "^[[A-Z]|[a-z]][[A-Z]|[a-z]|\\d|[_]]{7,29}$";
        if (userName.matches(regularExpression)) {
            System.out.println("Valid");
        } else {
            System.out.println("Invalid");
        }
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X