Expresión regular para validar el nombre de usuario

Intento crear una expresión regular para validar nombres de usuario con estos criterios:

  1. Solo contiene caracteres alfanuméricos , guión bajo y punto .
  2. El subrayado y el punto no pueden estar al final o al inicio de un nombre de usuario (p _username Ej. _username / username_ / .username / username. ).
  3. El subrayado y el punto no pueden estar uno al lado del otro (por ejemplo, user_.name ).
  4. El guión bajo o el punto no se pueden usar varias veces seguidas (p. user__name . user..name user__name / nombre de user..name ).
  5. El número de caracteres debe estar entre 8 y 20.

Esto es lo que he hecho hasta ahora; parece que impone todas las reglas de criterio, pero la quinta regla . No sé cómo agregar la quinta regla a esto:

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

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

Una ligera modificación a la respuesta de Phillip corrige el último requisito

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

Supongo que tendrías que usar expresiones Lookahead aquí. http://www.regular-expressions.info/lookaround.html

Tratar

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

[a-zA-Z0-9] ENTONCES un alfanumérico (

_(?!\.) a _ no seguido de a. O

\.(?!_) a. no seguido por un _ O

[a-zA-Z0-9] un alfanumérico) PARA

{6,18} mínimo 6 a máximo 18 veces ENTONCES

[a-zA-Z0-9] un alfanumérico

(El primer carácter es alfanumérico, luego de 6 a 18 caracteres, el último carácter es alfanumérico, 6 + 2 = 8, 18 + 2 = 20)

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

^ # Inicio de la línea

[a-z0-9_-] # Coincide con los caracteres y símbolos de la lista, az, 0-9, guión bajo, guión

{3,15} # Longitud de al menos 3 caracteres y longitud máxima de 15

$ # Fin de la línea

Este debería hacer el truco:

 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 } 

Por mucho que me gusten las expresiones regulares, creo que hay un límite para lo que es legible

Entonces sugeriría

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

Es más largo, pero no será necesario que el mantenedor abra el expresso para comprenderlo.

Claro que puedes comentar una expresión regular larga pero luego quien lo lea tiene que confiar en la confianza …….

Lo siento, lo generé desde mi propia biblioteca y usa la syntax válida para Dart / Javascript / Java / Python, pero de todos modos, aquí va:

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

Mi código de biblioteca:

 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(); 

Mi biblioteca: https://github.com/thebinarysearchtree/RegExpBuilder