2009-08-22 16 views
13

¿Alguien me puede ayudar a escribir una expresión regular para verificar si una contraseña tiene al menos una letra y un número en ella?Expresión regular para verificar si una contraseña dada contiene al menos un número y una letra en C#?

Tengo un requisito de que las contraseñas de los usuarios deben ser alfanuméricas y quiero poder verificar eso con una expresión regular.

+0

¿Vótese el papel? De Verdad? –

+10

@Paco: ¡No sabía que el desbordamiento de pila solo permitía preguntas difíciles! – LukeH

+0

Estoy de acuerdo con Luke. Stack Overflow no tiene que ser para el profesional veterano que tiene un código descompilado bytecode, o 'dónde está la documentación WMI'. –

Respuesta

2
bool isValid = Regex.IsMatch(password, @"[a-zA-Z]") && 
       Regex.IsMatch(password, @"\d"); 
7

Si desea que en una expresión regular que puede utilizar "[a-zA-Z].*\\d|\\d.*[a-zA-Z]" aunque dos controles separados puede ser más fácil de leer.

Editar: Una aproximación con dos cheques, que me parece bastante legible, podría tener este aspecto:

Regex.IsMatch(password, "\\d") && Regex.IsMatch(password, "[a-zA-Z]") 
+0

Y luego necesitaría una verificación adicional para probar si solo tiene caracteres alfanuméricos. –

21

búsqueda positiva hacia delante es lo que estás buscando. La expresión regular es el siguiente:

(?=.*[A-Za-z])(?=.*[0-9])[A-Za-z0-9]+ 

Aquí, (?=.*[A-Za-z]) es la búsqueda positiva hacia delante que afirma que su cadena como al menos un carácter, y (?=.*[0-9]) afirma que tiene al menos un dígito. Es importante tener en cuenta que la anticipación positiva no devuelve una coincidencia, sino que afirma si existe una coincidencia o no. Por lo tanto, debe leer la expresión regular anterior como "afirmar que tiene al menos un carácter, afirmar que tiene al menos un dígito, ahora que sabemos que las aserciones han pasado, simplemente verifique los caracteres alfanuméricos".

Esto es muy interesante porque le permite combinar fácilmente los requisitos de validación de su aplicación, sin que su regex sea muy compleja. Por ejemplo, si ahora necesita la cadena tener exactamente 20 caracteres, sólo tiene que añadir una nueva afirmación de búsqueda positiva hacia delante, así:

(?=[A-Za-z0-9]{20})(?=.*[A-Za-z])(?=.*[0-9])[A-Za-z0-9]+ 

espero que ayude!

+0

¿por qué no esto? (? =. * [A-Za-z]) (? =. * [0-9]) [A-Za-z0-9] {20} –

+0

¿Por qué necesita '. *' En su búsqueda positiva? No entiendo cómo el resultado sería diferente si lo omitiera. – xr280xr

Cuestiones relacionadas