2011-08-09 10 views
20

Pracuję nad aplikacją, w której muszę przekazać cokolwiek przed znakiem "@" z adresu e-mail użytkownika jako jego/jej imię i nazwisko. Na przykład, jeśli użytkownik ma adres e-mail "[email protected]", niż gdy użytkownik przesyła formularz, usuwam "@ example.com" z wiadomości e-mail i przypisuję "użytkownika" jako imię i nazwisko.Usuń znak "@" i wszystko inne po nim w Ruby

Zrobiłem badania, ale nie byłem w stanie znaleźć sposobu na zrobienie tego w Ruby. Jakieś sugestie ??

+0

Dlaczego używasz do tego wyrażenia regularnego? http://stackoverflow.com/questions/201323/what-is-the-best-regular-expression-for-validating-email-addresses –

Odpowiedz

41

Aby złapać nic przed znakiem @:

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

+1 dla RegEx. Zapewnia większą wszechstronność i pomaga uniknąć niebezpiecznego nawyku odwoływania się do literalnej pozycji indeksu. – Ishpeck

+5

@Ishpeck: Jaką wszechstronność potrzebujesz? Dzielicie łańcuch na znaku '@ '. Nie jest to szczególnie niestabilne zadanie i dodanie złożoności całego Regexp FSM do miksu nie wydaje się go zmniejszać. – Chuck

+0

Można użyć wyrażenia regularnego do dezynfekcji danych dla, powiedzmy, zapytania do bazy danych. http://xkcd.com/327/ – Ishpeck

0

użycie gsub i wyrażenie regularne

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

Ludzie przechodzą do wyrażeń regularnych zdecydowanie zbyt łatwo. Powinny one * nie * być pierwszym wyborem do podziału ciągu znaków. – meagar

+0

Możesz spojrzeć na benchmark, który dodałem, zwróć uwagę na ostateczną odpowiedź, a nie na próbę. Zakładając, że silnik regex jest już odwirowany, jest szybszy. –

+0

Należy dodać, że nie ma powodu, aby zoptymalizować takie oświadczenie, chyba że jest w pętli. Opóźnienie sieci jest o wiele większą sprawą niż sposób analizowania/sprawdzania poprawności parametru. Chciałem tylko zwrócić uwagę na to, że opublikowałeś uogólniony i preache comment –

10

Wystarczy podzielić na symbol @ i złapać, co się przed nim.

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

Możesz podzielić na "@" i po prostu użyć pierwszej części.

email.split("@")[0] 

To da ci pierwszą część przed "@".

8

String#split będzie przydatna. Podając łańcuch i argument, zwraca tablicę dzielącą łańcuch na osobne elementy tego łańcucha. Więc jeśli miałeś:

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

Zatem byłoby wziąć e.split("@")[0] dla pierwszej części adresu.

Powiązane problemy