No olvides que en la informática un error casi siempre tiene diferentes resoluciones, por lo tanto nosotros aquí te compartimos lo mejor y más óptimo.
Solución:
Aquí hay un enfoque para resolver esto con Regex
string input = "[email protected]";
string pattern = @"(?<=[w]1)[w-._+%]*(?=[w]1@)";
string result = Regex.Replace(input, pattern, m => new string('*', m.Length));
//j**[email protected]
Explicación:
(?<=[w]1)
el nombre tiene que comenzar con 1 palabra-carácter
[w-._+%]*
la pieza de repuesto puede contener 0-n caracteres de palabra, incluidos -_.+%
(?=[w]1@)
el nombre tiene que terminar con un carácter de palabra seguido de un @
Dependiendo de la cantidad de caracteres que desee que permanezcan sin cambios, puede cambiar 1
a 2
o algo más al principio o al final.
Si siempre desea enmascarar algo entre el primer carácter y el último carácter antes de @ con un número fijo de caracteres enmascarados, puede usar lo siguiente
var email="[email protected]";
var maskedEmail = string.Format("0****1", email[0],
email.Substring(email.IndexOf('@')-1));
Puede modificar la línea anterior para su requerimiento.
La línea de arriba te dará el resultado "a****[email protected]"
Tenga en cuenta que enmascarar el correo electrónico siempre con un número fijo de caracteres hará que sea difícil adivinar el correo electrónico y es un poco más seguro.
ex: [email protected]
después de la máscara: un ****[email protected]
No puedo ver dónde se inicializa su variable k en su fragmento de código. Si tuviera que hacer una puñalada salvaje en cuanto a por qué está obteniendo una excepción de índice fuera de los límites, esa sería mi puñalada.
Aunque diría que podrías lograr algo muy similar a lo que estás haciendo usando Regex. Lo hice así:
public string ObfuscateEmail(string email)
var displayCase = email;
var partToBeObfuscated = Regex.Match(displayCase, @"[^@]*").Value;
if (partToBeObfuscated.Length - 3 > 0)
var obfuscation = "";
for (var i = 0; i < partToBeObfuscated.Length - 3; i++) obfuscation += "*";
displayCase = String.Format("0123", displayCase[0], displayCase[1], obfuscation, displayCase.Substring(partToBeObfuscated.Length - 1));
else if (partToBeObfuscated.Length - 3 == 0)
displayCase = String.Format("0*1", displayCase[0], displayCase.Substring(2));
return displayCase;
Aquí hay un violín de todos sus casos de prueba proporcionados que pasan bastante cerca de lo que estaba describiendo https://dotnetfiddle.net/fU2RUo
[EDIT] Mi código no intenta ofuscar los correos electrónicos cuyas direcciones antes de la @ tienen menos de 3 caracteres, si este es un requisito, deberá modificar el código, pero no pensé que fuera un caso muy realista tener que construir un Caso para.