2011-08-09 15 views
20

Estoy trabajando en una aplicación en la que necesito pasar algo antes del signo "@" de la dirección de correo electrónico del usuario como su nombre y apellido. Por ejemplo, si el usuario tiene una dirección de correo electrónico "[email protected]", cuando el usuario envía el formulario, elimino "@ example.com" del correo electrónico y asigno "usuario" como nombre y apellido.Quitar el signo "@" y todo lo que sigue en Ruby

He hecho investigación pero no he podido encontrar la manera de hacerlo en Ruby. Alguna sugerencia ??

+0

¿Por qué usa una expresión regular para esto? http://stackoverflow.com/questions/201323/what-is-the-best-regular-expression-for-validating-email-addresses –

Respuesta

41

Para coger nada antes del símbolo @:

my_string = "[email protected]" 
substring = my_string[/[^@]+/] 
# => "user" 
+0

+1 para RegEx. Le da más versatilidad y le ayuda a evitar el hábito peligroso de hacer referencia a una posición de índice literal. – Ishpeck

+5

@Ishpeck: ¿Cuánta versatilidad necesitas? Estás dividiendo en cadena en el signo '@'. No es una tarea particularmente volátil, y agregar la complejidad de todo un FSM Regexp a la mezcla no parece hacerlo menos. – Chuck

+0

Puede usar la expresión regular para desinfectar los datos para, por ejemplo, una consulta de base de datos. http://xkcd.com/327/ – Ishpeck

0

uso gsub y una expresión regular

first_name = email.gsub(/@[^\s]+/,"") 



irb(main):011:0> Benchmark.bmbm do |x| 
irb(main):012:1* email = "[email protected]" 
irb(main):013:1> x.report("split"){100.times{|n| first_name = email.split("@")[0]}} 
irb(main):014:1> x.report("regex"){100.times{|n| first_name = email.gsub(/@[a-z.]+/,"")}} 
irb(main):015:1> end 
Rehearsal ----------------------------------------- 
split 0.000000 0.000000 0.000000 ( 0.000000) 
regex 0.000000 0.000000 0.000000 ( 0.001000) 
-------------------------------- total: 0.000000sec 

      user  system  total  real 
split 0.000000 0.000000 0.000000 ( 0.001000) 
regex 0.000000 0.000000 0.000000 ( 0.000000) 
=> [#<Benchmark::Tms:0x490b810 @label="", @stime=0.0, @real=0.00100016593933105, @utime=0.0, @cstime=0.0, @total=0.0, @cutime=0.0>, #<Benchmark::Tms:0x4910bb0 @ 
label="", @stime=0.0, @real=0.0, @utime=0.0, @cstime=0.0, @total=0.0, @cutime=0.0>] 
+0

Las personas van a expresiones regulares con demasiada facilidad. No deberían * ser * su primera opción para dividir una cuerda. – meagar

+0

Es posible que desee ver el punto de referencia que agregué, tenga en cuenta la respuesta final, no el ensayo. Suponiendo que el motor de expresiones regulares ya está activado, es más rápido. –

+0

Debo añadir que no hay ninguna razón para optimizar tal declaración a menos que esté en un bucle. la latencia de red es mucho más importante que la forma en que analiza/valida un parámetro. Solo quería señalar el punto, ya que publicaste un comentario generalizado y prudente –

10

Sólo se separaron en el símbolo @ y agarrar lo que iba delante de él.

string.split('@')[0] 
40

Puede dividir en "@" y simplemente usar la primera parte.

email.split("@")[0] 

Eso le dará la primera parte antes de la "@".

8

El String#split será útil. Dada una cadena y un argumento, devuelve una matriz dividiendo la cadena en elementos separados en esa cadena. Así que si tenía:

e = [email protected] 
e.split("@") 
#=> ["test", "testing.com"] 

De este modo le tomaría e.split("@")[0] para la primera parte de la dirección.

Cuestiones relacionadas