Удалить знак @ и все после него в Ruby

Я работаю над приложением, в котором мне нужно передать что-либо до знака «@» с адреса электронной почты пользователя в качестве его имени и фамилии. Например, если у пользователя есть адрес электронной почты «[email protected]», тогда, когда пользователь отправляет форму, я удаляю «@example.com» из электронной почты и назначаю «user» в качестве имени и фамилии.

Я провел исследование, но не смог найти способ сделать это в Ruby. Какие-либо предложения ??


person Smoke    schedule 09.08.2011    source источник
comment
Почему вы используете регулярное выражение для этого? stackoverflow.com/questions/201323/   -  person Andrew Grimm    schedule 10.08.2011


Ответы (5)


Чтобы поймать все до знака @:

my_string = "[email protected]"
substring = my_string[/[^@]+/]
# => "user"
person Dylan Markow    schedule 09.08.2011
comment
+1 за регулярное выражение. Дает вам больше гибкости и помогает избежать опасной привычки ссылаться на буквальную позицию индекса. - person Ishpeck; 09.08.2011
comment
@Ishpeck: Какая универсальность вам нужна? Вы разбиваете строку по знаку @. Это не особенно изменчивая задача, и добавление сложности всего Regexp FSM к смеси, похоже, не делает ее менее сложной. - person Chuck; 09.08.2011
comment
Вы можете использовать регулярное выражение для очистки данных, скажем, для запроса к базе данных. xkcd.com/327 - person Ishpeck; 09.08.2011
comment
@ Дилан: Спасибо! это именно то, что я искал. Благодарю вас. - person Smoke; 09.08.2011
comment
Я согласен с тем, что #split, вероятно, является более простым ответом для этого конкретного сценария, но я не думаю, что регулярное выражение слишком сложное. - person Dylan Markow; 09.08.2011

Вы можете разделить на "@" и просто использовать первую часть.

email.split("@")[0]

Это даст вам первую часть до "@".

person J Lundberg    schedule 09.08.2011

Просто разделитесь на символ @ и возьмите то, что было до него.

string.split('@')[0]
person Chuck    schedule 09.08.2011

String#split будет полезно. Учитывая строку и аргумент, он возвращает массив, разбивающий строку на отдельные элементы этой строки. Итак, если у вас было:

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

Таким образом, вы бы взяли e.split("@")[0] за первую часть адреса.

person Pygmalion    schedule 09.08.2011

использовать gsub и регулярное выражение

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>]
person Tim Hoolihan    schedule 09.08.2011
comment
Люди слишком охотно переходят к регулярным выражениям. Они не должны быть вашим первым выбором для разделения строки. - person meagar; 09.08.2011
comment
Вы можете взглянуть на тест, который я добавил, обратите внимание на окончательный ответ, а не на репетицию. Предполагая, что механизм регулярных выражений уже запущен, он работает быстрее. - person Tim Hoolihan; 09.08.2011
comment
Я должен добавить, что нет причин оптимизировать такой оператор, если он не находится в цикле. сетевая задержка гораздо важнее, чем то, как вы анализируете/проверяете параметр. Я просто хотел подчеркнуть, что вы опубликовали общий и проповеднический комментарий. - person Tim Hoolihan; 09.08.2011
comment
Бенчмаркинг — это какое-то безумие, а использование всего 100 итераций — невероятно фальшивка. Несмотря на это, email[0,email.index('@')] не только выбивает из колеи оба ваших тестовых решения, но и является очевидным и прямолинейным, что гораздо важнее. Поиск подстроки путем замены элементов, не являющихся подстроками, пустой строкой с помощью регулярного выражения — это примерно такое же обходное решение, какое только можно получить. Регулярное выражение не для этого, вы неправильно его используете. - person meagar; 10.08.2011
comment
Также обратите внимание, что ваше регулярное выражение прерывается, когда часть домена включает дефисы или цифры, оба из которых допустимы. Вы можете добавить их в шаблон, но суть в том, что вам не нужно этого делать. Вы начали с поиска символов до @, и вдруг вы пишете регулярное выражение для проверки доменных имен. Вот что происходит, когда вы пытаетесь сделать регулярные выражения решением любой тривиальной проблемы. - person meagar; 10.08.2011
comment
@TimHoolihan, давайте продолжим обсуждение в чате - person meagar; 10.08.2011