J'essaie de créer une expression régulière pour valider les noms d'utilisateur par rapport à ces critères:
_username
/username_
/.username
/username.
).user_.name
).user__name
/user..name
).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]+)*$
^(?=.{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 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)
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");
}
}
}
^ [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
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 .......
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
}
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