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 par rapport à ces critères:

  1. contient uniquement caractères alphanumériques , trait de soulignement et dot.
  2. Le Trait de soulignement et le point ne peuvent pas être à la fin ou démarrer d'un nom d'utilisateur (adresse e.g _username / username_ / .username / username.).
  3. Le Trait de soulignement et le point ne peuvent pas être l'un à côté de l'autre (par exemple user_.name).
  4. Le Trait de soulignement ou le point ne peut pas être utilisé plusieurs fois dans une ligne (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 5ème règle. Je ne sais pas comment ajouter la 5ème règle:

 ^[a-zA-Z0-9]+([._]?[a-zA-Z0-9]+)*$
31
demandé sur Ωmega 2012-08-18 15:39:45

8 réponses

^(?=.{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
134
répondu Ωmega 2012-08-18 14:07:03

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]$
7
répondu Patrick McDonald 2012-08-18 12:36:28

Je suppose que vous devriez utiliser des 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 alors (

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

\.(?!_) un . non suivie d'un _ ou

[a-zA-Z0-9] un alphanumérique) pour

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

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

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

6
répondu PhilMasterG 2012-08-18 13:37:11

^[a-z0-9_-]{3,15}$

^ # Début de la ligne

[a-z0-9_ -] # correspond aux caractères et symboles dans la liste, a-z, 0-9, trait de soulignement, trait d'Union

{3,15} # Longueur d'au moins 3 caractères et longueur maximale de 15

$ # Fin de la ligne

1
répondu Mehul Jariwala 2017-04-17 15:38:01

Celui-ci devrait faire l'affaire:

if (Regex.IsMatch(text, @"
    # Validate username with 5 constraints.
    ^                          # Anchor to start of string.
    # 1- only contains alphanumeric characters , underscore and dot.
    # 2- underscore and dot can't be at the end or start of username,
    # 3- underscore and dot can't come next to each other.
    # 4- each time just one occurrence of underscore or dot is valid.
    (?=[A-Za-z0-9]+(?:[_.][A-Za-z0-9]+)*$)
    # 5- number of characters must be between 8 to 20.
    [A-Za-z0-9_.]{8,20}        # Apply constraint 5.
    $                          # Anchor to end of string.
    ", RegexOptions.IgnorePatternWhitespace))
{
    // Successful match
} else {
    // Match attempt failed
} 
0
répondu ridgerunner 2012-08-18 13:40:43

Autant que j'aime les expressions régulières, je pense qu'il y a une limite à ce qui est lisible

Donc je suggère

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 il n'aura pas besoin que le mainteneur ouvre expresso pour comprendre.

Bien sûr, vous pouvez commenter une longue expression rationnelle, mais qui la lit doit compter sur la confiance.......

0
répondu James Kyburz 2012-08-18 13:45:54

Err désolé j'ai généré cela à partir de ma propre bibliothèque et il utilise la syntaxe valide pour Dart / Javascript/Java / Python, mais de toute façon, voici:

(?:^)(?:(?:[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKlMNOPQRSTUVWXYZ0123456789]){1,1})(?!(?:(?:(?:(?:_\.){1,1}))|(?:(?:(?:__){1,1}))|(?:(?:(?:\.\.){1,1}))))(?:(?:(?:(?:[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKlMNOPQRSTUVWXYZ0123456789._]){1,1})(?!(?:(?:(?:(?:_\.){1,1}))|(?:(?:(?:__){1,1}))|(?:(?:(?:\.\.){1,1}))))){6,18})(?:(?:[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKlMNOPQRSTUVWXYZ0123456789]){1,1})(?:$)

Code de ma bibliothèque:

var alphaNumeric = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "l", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"];
var allValidCharacters = new List.from(alphaNumeric);
allValidCharacters.addAll([".", "_"]);

var invalidSequence = (r) => r
  .eitherString("_.")
  .orString("__")
  .orString("..");

var regex = new RegExpBuilder()
  .start()
  .exactly(1).from(alphaNumeric).notBehind(invalidSequence)
  .min(6).max(18).like((r) => r.exactly(1).from(allValidCharacters).notBehind(invalidSequence))
  .exactly(1).from(alphaNumeric)
  .end()
  .getRegExp();

Ma bibliothèque: https://github.com/thebinarysearchtree/RegExpBuilder

0
répondu 2012-08-20 11:02:44
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");
        }
    }
}
0
répondu isurie 2018-10-06 12:12:05