Премахнете знака @ и всичко след него в 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 за RegEx. Дава ви повече гъвкавост и ви помага да избегнете опасния навик да препращате към буквална индексна позиция. - 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 вероятно е по-лесният отговор за този конкретен сценарий -- но не мисля, че RegExp е прекалено сложен - 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