2011-08-09 14 views
20

में इसके बाद "@" चिह्न और उसके बाद सबकुछ निकालें, मैं उस एप्लिकेशन पर काम कर रहा हूं जहां मुझे उपयोगकर्ता के ईमेल पते से "@" चिह्न से पहले किसी भी नाम पर हस्ताक्षर करने की आवश्यकता है, उसका पहला नाम और अंतिम नाम। उदाहरण के लिए यदि उपयोगकर्ता के पास फॉर्म सबमिट करने के बाद उपयोगकर्ता का ईमेल पता "[email protected]" है, तो मैं ईमेल से "@ example.com" हटा देता हूं और "उपयोगकर्ता" को पहले और अंतिम नाम के रूप में निर्दिष्ट करता हूं।रुबी

मैंने शोध किया है लेकिन रूबी में ऐसा करने का कोई तरीका नहीं ढूंढ पाया। कोई सुझाव ??

+0

आप इसके लिए नियमित अभिव्यक्ति का उपयोग क्यों कर रहे हैं? http://stackoverflow.com/questions/201323/what-is-the-best-regular-expression-for-validating-email-addresses –

उत्तर

41

@ चिह्न से पहले कुछ भी को पकड़ने के लिए। स्ट्रिंग और तर्क को देखते हुए, यह उस स्ट्रिंग पर अलग-अलग तत्वों में स्ट्रिंग को विभाजित करने वाली एक सरणी देता है। तो अगर आप था:

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

इस प्रकार आप पते का पहला भाग के लिए e.split("@")[0] ले जाएगा।

+0

RegEx के लिए +1। आपको अधिक बहुमुखी प्रतिभा देता है और आपको एक शाब्दिक सूचकांक स्थिति के संदर्भ में खतरनाक आदत से बचने में मदद करता है। – Ishpeck

+5

@Ishpeck: आपको कितनी बहुमुखी प्रतिभा की आवश्यकता है? आप '@' चिह्न पर स्ट्रिंग पर विभाजित हो रहे हैं। यह विशेष रूप से अस्थिर कार्य नहीं है, और मिश्रण में पूरे रेगेक्सपी एफएसएम की जटिलता को जोड़ने से ऐसा कोई कम नहीं लगता है। – Chuck

+0

आप डेटाबेस क्वेरी के लिए डेटा को sanitize करने के लिए regex का उपयोग कर सकते हैं। http://xkcd.com/327/ – Ishpeck

0

उपयोग 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>] 
+0

लोग नियमित रूप से बहुत ही आसानी से अभिव्यक्तियों पर जाते हैं। उन्हें स्ट्रिंग को विभाजित करने के लिए आपकी पहली पसंद नहीं होनी चाहिए। – meagar

+0

आप जो बेंचमार्क जोड़ा है, उसे देखना चाहते हैं, अंतिम जवाब को रिहर्सल पर ध्यान दें। मान लें कि रेगेक्स इंजन पहले से ही फैला हुआ है, यह तेज़ है। –

+0

मुझे यह जोड़ना चाहिए कि इस तरह के कथन को अनुकूलित करने का कोई कारण नहीं है जब तक यह लूप में न हो। नेटवर्क विलंबता पैरामीटर को पार्स/मान्य करने के तरीके से कहीं अधिक बड़ा सौदा है। मैं बस बिंदु बनाना चाहता था क्योंकि आपने एक सामान्यीकृत और प्रचारित टिप्पणी पोस्ट की है –

10

बस @ प्रतीक पर विभाजित है और हड़पने जिस पर वह पहले चला गया।

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

आप "@" पर विभाजित हो सकते हैं और केवल पहले भाग का उपयोग कर सकते हैं।

email.split("@")[0] 

इससे आपको "@" से पहले पहला भाग मिल जाएगा।

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