Forum: Rails-ES sacar subcadenas siguiendo un patron de un texto

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Thomas J. (Guest)
on 2009-01-30 14:38
hola,
lo que pretendo hacer es sacar individualmente los mails de un texto, ya
que vamos a incluir nuestras listas de correo a base de datos y tenemos
las direcciones de email en texto. Basicamente mi problema es qué
funcion usar, ya que la expresión regular de un mail la he encontrado
por ahi
/\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})/
Siendo mi texto 'texto' y exp =
/\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})/ intento hacer:
mail = exp.match(texto)
me devuelve bien, el email separado pero como puedo crear un bucle para
seguir sacando los siguientes mails del texto por dnd me había quedado?
si hago un bucle podria ir guardandolos o grabandolos en algun array o
algo. Gracias!!
javier ramirez (Guest)
on 2009-01-30 14:54
(Received via mailing list)
> Siendo mi texto 'texto' y exp =
> /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})/ intento hacer:
> mail = exp.match(texto)
> me devuelve bien, el email separado pero como puedo crear un bucle para
> seguir sacando los siguientes mails del texto por dnd me había quedado?
>

usa el método scan de la cadena directamente

texto.scan(exp)

y te da el array de ocurrencias

saludos,



--
javier ramírez

..i do ruby on rails development in madrid, spain, at
http://www.aspgems.com
..you can find out more about me on http://formatinternet.wordpress.com
and http://workingwithrails.com/person/5987-javier-ramirez
Thomas J. (Guest)
on 2009-01-30 15:19
javier ramirez wrote:

>
> usa el método scan de la cadena directamente
>
> texto.scan(exp)
>
> y te da el array de ocurrencias
>
> saludos,
>
>
>
> --
> javier ramírez
>
> ..i do ruby on rails development in madrid, spain, at
> http://www.aspgems.com
> ..you can find out more about me on http://formatinternet.wordpress.com
> and http://workingwithrails.com/person/5987-javier-ramirez

lo habia probado ya, si el mail es removed_email_address@domain.invalid
el resultado que me da es [["xxx","yyy.zzz"]] se come la @ y me lo parte
en 2, a parte de q solo me saca 1, no se qué hacer, si un bucle o algo
pero no se q condicion poner. igual tengo mal mi expresion regular pero
en otros casos me ha dado bien... muchas gracias!!
javier ramirez (Guest)
on 2009-01-30 15:41
(Received via mailing list)
> lo habia probado ya, si el mail es removed_email_address@domain.invalid
> el resultado que me da es [["xxx","yyy.zzz"]] se come la @ y me lo parte
>

eso debe ser porque usas grupos (paréntesis) en al regexp.

las expresiones regulares para extraer un mail son más bien complicadas,
así que no me he parado a ver si la que tienes es muy buena o no, pero
quitándole los grupos podría quedar en algo así

/[^@\s]+@[-a-z0-9]+\.+[a-z]{2,}/

y ésa funciona en un scan

suerte,

--
javier ramírez

..i do ruby on rails development in madrid, spain, at
http://www.aspgems.com
..you can find out more about me on http://formatinternet.wordpress.com
and http://workingwithrails.com/person/5987-javier-ramirez
Andrés G. (Guest)
on 2009-01-30 16:01
(Received via mailing list)
Hola Javier, no te enfades, por ser puñetero, pero  ponte que los mail
los
tiene que extraer de un párrafo y la persona que escribió el párrafo
puso
algo así:
"me dirijo a ustedes para comunicarles que este es mi
email:removed_email_address@domain.invalid
<removed_email_address@domain.invalid>....y que esta es mi ...."
Como ves en =>> email:emailqueinteresa no se ha dejado el
correspondiente
espacio después de los dos puntos.

Esto por consola me da:
=>["email:removed_email_address@domain.invalid
<removed_email_address@domain.invalid>",
"removed_email_address@domain.invalid",...]

¿un mail puede  llevar ? (:,;[^*...)¿esto es algo que se contemple? ¿o
te
estoy tocando las bolas gratuitamente?

¿Conoces alguna expreg realmente buena para solventar esta y mil
chorradas
más?

En cualquier caso yo tambien soy un novato y te agradezco que me hayas
descubierto al amigo [scan] igual lo habia leido ya, pero cuando tienes
el
problema no te acuerdas de como se hace hasta que lo haces...

Un saludo

El 30 de enero de 2009 14:40, javier ramirez
<removed_email_address@domain.invalid>escribió:
Juan martin F. (Guest)
on 2009-01-30 17:07
(Received via mailing list)
solo por curiosidad, ¿no necesitas tener un caracter separador que
identifique donde empieza y donde termina el email?
tenes una lista de emails o lo que en realidad queres hacer es extraer
los email de un .html?


2009/1/30 Andrés gutiérrez <removed_email_address@domain.invalid>:
> ¿un mail puede  llevar ? (:,;[^*...)¿esto es algo que se contemple? ¿o te
>
>> quitándole los grupos podría quedar en algo así
>>
>> http://www.aspgems.com
> removed_email_address@domain.invalid
> http://lists.simplelogica.net/mailman/listinfo/ror-es
>
>



--
............................................................
J. Martin Fernandez Szutner
removed_email_address@domain.invalid [main address]
móvil: ++521(662)224.02.81
msn: removed_email_address@domain.invalid
skype: martinszutner




...........................................................................................
Este correo electronico es confidencial y/o puede contener informacion
privilegiada.
Si usted no es su destinatario o no es alguna persona autorizada por
este para recibir sus correos electronicos, NO debera usted utilizar,
copiar, revelar, o tomar ninguna accion basada en este correo
electronico o cualquier otra informacion incluida en el, favor de
notificar al remitente de inmediato mediante el reenvio de este correo
electronico y borrar a continuacion totalmente este correo electronico
y sus anexos.
Nota: Los acentos y caracteres especiales fueron omitidos para su
correcta lectura en cualquier medio electronico.

This e-mail is confidential and/or may contain privileged information.
If you are not the addressee or authorized to receive this for the
addressee, you must not use, copy, disclose, or take any action based
on this message or any
other informat ion herein, please advise the sender immediately by
reply this e-mail and delete this e-mail and its attachments.
...........................................................................................
Andrés G. (Guest)
on 2009-01-30 17:14
(Received via mailing list)
>>solo por curiosidad, ¿no necesitas tener un caracter separador que
>>identifique donde empieza y donde termina el email?
>>tenes una lista de emails o lo que en realidad queres hacer es extraer
>>los email de un .html?

Es igual, con la solución de Javier R. se pueden sacar los emails
de un
párrafo. Haz la prueba, abre un terminal y crea una cadena de texto con
emails:
cadena="removed_email_address@domain.invalid esto no es un email. Esto tampoco 
es un email.
removed_email_address@domain.invalid esto no es un email..."
veras que si haces:
matrizEmails = Array.new
matrizEmails = cadena.scan(/[^@\s]+@[-a-z0-9]+\.+[a-z]{2,}/)

matrizEmails.each {|email| puts email}
removed_email_address@domain.invalid
removed_email_address@domain.invalid
...
...

De manera mágica tendras una matriz con todos los emails.

Un saludo


El 30 de enero de 2009 16:06, Martin S.
<removed_email_address@domain.invalid>escribió:
Guillermo Álvarez Fernández (Guest)
on 2009-01-30 17:51
(Received via mailing list)
_______________________________________________
Ror-es mailing list
removed_email_address@domain.invalid
http://lists.simplelogica.net/mailman/listinfo/ror-es
Andrés G. (Guest)
on 2009-01-30 18:07
(Received via mailing list)
Mis dudas han sido puñeteramente aclaradas :)

Gracias Guillermo

Un saludo

El 30 de enero de 2009 16:50, Guillermo Álvarez Fernández <
removed_email_address@domain.invalid> escribió:
javier ramirez (Guest)
on 2009-01-30 18:08
(Received via mailing list)
hola,

> =>["email:removed_email_address@domain.invalid
> <mailto:removed_email_address@domain.invalid>", "removed_email_address@domain.invalid
> <mailto:removed_email_address@domain.invalid>",...]
> ¿un mail puede  llevar ? (:,;[^*...)¿esto es algo que se contemple? ¿o
> te estoy tocando las bolas gratuitamente?

por esto decía en mi mail:

"las expresiones regulares para extraer un mail son más bien complicadas,
así que no me he parado a ver si la que tienes es muy buena o no,"

validar toda la casuística de lo que puede valer como dirección de mail es
complejo, mucho.. hay expresiones regulares que dan miedo.


el problema inicial decía "tengo una regexp que ya me va bien para parsear
los mails pero sólo se ejecuta una vez". Así que el problema no está en la
regexp, sino en recoger todas las ocurrencias. Para eso, una solución es
modificar esa regexp para que no use grupos, y usar el scan.


si lo que quieres luego es validar cada cadena encontrada, en mi caso la
forma práctica que he encontrado y que me ha parecido más razonable es
utilizar el método parse de direcciones de TMAIL para ver si eso tiene
pinta de mail válido sí o no.

Si TMAIL lo sabe parsear, me creo que es una dirección. Si miras el fuente
del parser (basado en racc) que usa TMAIL para validar cabeceras,
verás que no es un tema trivial. Pero como ya está inventado, delego en su
validación y me va bien lo que me diga.




--
javier ramírez

..i do ruby on rails development in madrid, spain, at
http://www.aspgems.com
..you can find out more about me on http://formatinternet.wordpress.com
and http://workingwithrails.com/person/5987-javier-ramirez
Andrés G. (Guest)
on 2009-01-30 18:24
(Received via mailing list)
Rails usa ActionMailer, ActionMailer usa TMAIL luego ¿Cómo se usa el
metodo
parser de TMAIL en Rails?¿O me estoy liando?

Un saludo
El 30 de enero de 2009 17:08, javier ramirez
<removed_email_address@domain.invalid>escribió:
Ruben D. (Guest)
on 2009-01-30 18:35
(Received via mailing list)
>> TMail::Address.parse('removed_email_address@domain.invalid')
=> #<TMail::Address fo|removed_email_address@domain.invalid>
>> TMail::Address.parse('fo@removed_email_address@domain.invalid')
TMail::SyntaxError: parse error on token "@"
    from parser.y:379:in `on_error'
    from (irb):8:in `_racc_yyparse_c'
    ...
He probado eso en la consola de Rails, y como se ve para saber si un
correo
es valido solo hay que atrapar la excepción.

Saludos.
javier ramirez (Guest)
on 2009-01-30 18:42
(Received via mailing list)
Andrés gutiérrez wrote:
> Rails usa ActionMailer, ActionMailer usa TMAIL luego ¿Cómo se usa el
> metodo parser de TMAIL en Rails?¿O me estoy liando?

se usa el método parse de Tmail::Address exactamente como dice la
documentación de  tmail

dejo como ejercicio para casa que lo busques en google :)


--
javier ramírez

..i do ruby on rails development in madrid, spain, at
http://www.aspgems.com
..you can find out more about me on http://formatinternet.wordpress.com
and http://workingwithrails.com/person/5987-javier-ramirez
Andrés G. (Guest)
on 2009-01-30 18:46
(Received via mailing list)
>>dejo como ejercicio para casa que lo busques en google :)
ok ;D
Gracias

El 30 de enero de 2009 17:42, javier ramirez
<removed_email_address@domain.invalid>escribió:
Thomas J. (Guest)
on 2009-02-02 09:53
Hola,
gracias a todos por contestarme, hoy mismo probaré a ver si con esa
nueva expresión regular me funciona, y resolviendo la curiosidad, mis
jefes enviaban una lista de correos desde el outlook y ahora quieren
almacernar los mails en base de datos pero nada más me pasaron un txt
con las listas de correos a trozos, correos separados por comas,
espacios, algun texto, algun < y >, puntos y comas y yo es q les dije q
podria escanearlo y guardarlos, solo que al ponerme en ello encontre
problemas que creian q iba a ser más fácil para mi jejejej muchas
gracias a todos!
Thomas J. (Guest)
on 2009-02-02 10:12
Os amo!! funciona genial!! Muchas gracias nens, era la expresion
regular!!
This topic is locked and can not be replied to.