Hay muchas preguntas sobre expresiones regulares de correo electrónico / nombre de usuario y no tengo la intención de agregarlas, pero no pude encontrar la respuesta exacta. Estoy tratando de hacer coincidir y reemplazar el ID de correo electrónico de una cadena determinada.

Condición :

  1. El ID de correo electrónico completo puede contener (a-z, A-Z, 0-9,., -, _)
  2. El nombre de usuario o el dominio pueden tener 1 o más letras, por lo que x@y.z es un correo electrónico válido.
  3. El nombre de usuario y el dominio deben comenzar o terminar con [a-zA-z0-9]. es decir, no debe comenzar ni terminar con [._-]

Los estoy reemplazando con un *** (3 asteriscos) usando el siguiente código.

string replacedtext = Regex.Replace("Emails: x@x.co.uk , -x@x.co.uk, x-@xx.co.uk , xx@xx-.com, xx@x.x.com-",  @"[a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.[a-zA-Z-_]{2,6}", "***");

Funciona muy bien en la mayoría de los casos pero falla en algunos casos.

Resultado deseado : Emails: *** , -***, x-@xx.co.uk , xx@xx-.com, ***-

Salida actual : Emails: *** , ***, *** , ***, ***

Reemplaza todo -x@x.co.uk donde solo debería reemplazar x@x.co.uk e ignorar el guión.

0
Sachin D'Souza 22 ago. 2020 a las 15:09

1 respuesta

La mejor respuesta

Reemplaza [a-zA-Z0-9._-]+ por [a-zA-Z0-9]([a-zA-Z0-9\._-]*[a-zA-Z0-9])?. En palabras: a (letra o dígito), opcionalmente seguido de cualquier número o (letra / dígito / sin puntuación / guión) + otro (letra o dígito)

Regex.Replace(
    "Emails: x@x.co.uk , -x@x.co.uk, x-@xx.co.uk , xx@xx-.com, xx@x.x.com-",
    @"[a-zA-Z0-9]([a-zA-Z0-9._-]*[a-zA-Z0-9])?@[a-zA-Z0-9][a-zA-Z0-9._-]*?\.[a-zA-Z0-9._-]*[a-zA-Z0-9]", 
    "***");

Además, tenga en cuenta que el '.' debe escaparse también dentro de [].

0
Klaus Gütter 22 ago. 2020 a las 15:23