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:
- contient uniquement caractères alphanumériques , trait de soulignement et dot.
- 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.
). - Le Trait de soulignement et le point ne peuvent pas être l'un à côté de l'autre (par exemple
user_.name
). - Le Trait de soulignement ou le point ne peut pas être utilisé plusieurs fois dans une ligne (par exemple
user__name
/user..name
). - 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]+)*$
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
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]$
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)
^[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
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
}
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.......
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
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");
}
}
}