Tengo un formulario con un Listbox, en este Listbox tengo datos de un archivo .xml.

Cuando selecciono una entrada, obtengo el valor de esta entrada en una cadena var con:

string s = lstCust.SelectedItem.ToString();

Me da: "John Doe, JohnDoe@stack.io teléfono: 00336598745"

Ahora me gustaría obtener solo la dirección de correo, así que lo estoy intentando con este Regex:

@"([A-Za-z0-9._ % -] +@[A-Za-z0-9.-] +\.[a-zA-Z]{2,4})*"

Con este método:

string mail = Regex.Match(s, @"([A-Za-z0-9._ % -] +@[A-Za-z0-9.-] +\.[a-zA-Z]{2,4})*").Value;

Estoy seguro de que mi Regex funciona porque un

Regex.Match(s, @"([A-Za-z0-9._ % -] +@[A-Za-z0-9.-] +\.[a-zA-Z]{2,4})*").Success.ToString();

Me da un true.

Pero el valor de mi var mail siempre es igual a "" (vacío).

¿Alguna idea de qué estoy haciendo mal?

Gracias

2
Nan0 10 may. 2019 a las 17:05

3 respuestas

La mejor respuesta

Tiene espacios en su patrón de expresiones regulares que impiden que coincida. Elimina los espacios y el * al final

string mail = Regex.Match(s, @"([A-Za-z0-9._ % -]+@[A-Za-z0-9.-]+\.[a-zA-Z]{2,4})").Value;

Ejemplo de tormenta de expresiones regulares

4
bhmahler 10 may. 2019 a las 14:18

Prueba la siguiente Regex.

([a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9_-]+)

Le dará el correo electrónico JohnDoe@stack.io de la cadena de entrega John Doe, JohnDoe@stack.io teléfono: 00336598745

Regex Demo

1
Vignesh Kumar A 10 may. 2019 a las 14:16

Tu expresión en realidad no coincide. Tiene un * (0 o más ocurrencias) después de su grupo de captura. Debido a que la expresión en realidad no coincide, encuentra 0 ocurrencias de la expresión en el grupo de captura, pero debido a * esto está permitido, por lo tanto, la coincidencia tiene éxito.

Si solo hay una dirección de correo electrónico en la cadena con la que coincide. elimine el * al final e intente averiguar por qué la expresión regular no funciona realmente.

0
ikkentim 10 may. 2019 a las 14:16