web-dev-qa-db-fra.com

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 alphanumérique caractères, soulignement et point.
  2. Le trait de soulignement et le point ne peuvent pas être au fin ou début d'un nom d'utilisateur (par exemple _username/username_/.username/username.).
  3. Le trait de soulignement et le point ne peuvent pas être côte à côte (par exemple user_.name).
  4. Le trait de soulignement ou le point ne peut pas être utilisé plusieurs fois dans une rangé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; cela sonne, 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 à ceci:

 ^[a-zA-Z0-9]+([._]?[a-zA-Z0-9]+)*$
39
mohsen dorparasti
^(?=.{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
175
Ωmega

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]$
8
Patrick McDonald

Je suppose que vous devez utiliser des expressions Lookahead ici. http://www.regular-expressions.info/lookaround.html

Essayer

^[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 de a. OU

\.(?!_) a. non suivi 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 alphanum, 6 + 2 = 8, 18 + 2 = 20)

7
PhilMasterG
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");
        }
    }
}
1
isurie

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

^ # Début de la ligne

[a-z0-9_-] # Correspondance des caractères et des symboles dans la liste, a-z, 0-9, soulignement, trait d'union

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

$ # Fin de ligne

1
Mehul Jariwala

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

Bien sûr, vous pouvez commenter un long regex, mais alors qui le lit, il doit compter sur la confiance .......

1
James Kyburz

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
ridgerunner

Je suis désolé d'avoir 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})(?:$)

Mon code de 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
user1294594