एक नियमित अभिव्यक्ति का उपयोग करके ईमेल पते को कैसे मान्य किया जाए?


3309

वर्षों से मैंने धीरे-धीरे एक नियमित अभिव्यक्ति विकसित की है जो MOST ईमेल पतों को सही ढंग से मान्य करती है, यह मानते हुए कि वे सर्वर के रूप में आईपी पते का उपयोग नहीं करते हैं।

मैं इसे कई PHP कार्यक्रमों में उपयोग करता हूं, और यह ज्यादातर समय काम करता है। हालांकि, समय-समय पर मुझे किसी ऐसे व्यक्ति से संपर्क होता है जो इसे इस्तेमाल करने वाली साइट से परेशान हो रहा है, और मैं कुछ समायोजन करने के लिए समाप्त हो रहा हूं (हाल ही में मुझे एहसास हुआ कि मैं 4-वर्ण TLDs की अनुमति नहीं दे रहा था)।

ईमेल को मान्य करने के लिए आपके पास सबसे अच्छा नियमित अभिव्यक्ति क्या है या आपने देखा है?

मैंने कई समाधान देखे हैं जो कई छोटी अभिव्यक्तियों का उपयोग करने वाले फ़ंक्शंस का उपयोग करते हैं, लेकिन मैं एक सरल फ़ंक्शन में एक लंबी जटिल अभिव्यक्ति के बजाय एक और जटिल फ़ंक्शन में कई छोटी अभिव्यक्ति का उपयोग कर सकता हूं।



5
रेगेक्स जो यह पुष्टि कर सकता है कि आईडीएनए सही ढंग से स्वरूपित है स्टेक्सएक्सचेंज में फिट नहीं होता है। (कैनोनिकलिसिस पर नियम वास्तव में अत्याचारी और विशेष रूप से
अस्वच्छ


रेग्जेस कुछ मामलों में परिवर्तनशील हो सकते हैं , एक ईमेल कॉन्फ्रेंस में एक स्थान हो सकता है, और अन्य समय में, इसमें कोई स्थान नहीं हो सकता है।
g21cểơửṩ

जवाबों:


2438

पूरी तरह से RFC 822 अनुरूप regex अक्षम और इसकी लंबाई की वजह से अस्पष्ट है। सौभाग्य से, RFC 822 को दो बार अलग किया गया था और ईमेल पते के लिए वर्तमान विनिर्देश RFC 5322 है । RFC 5322 एक रेगेक्स की ओर जाता है जिसे समझा जा सकता है यदि कुछ मिनटों के लिए अध्ययन किया जाए और वास्तविक उपयोग के लिए पर्याप्त कुशल हो।

एक RFC 5322 आज्ञाकारी regex पृष्ठ के शीर्ष पर http://emailregex.com/ पर पाया जा सकता है, लेकिन IP पते पैटर्न का उपयोग करता है जो बग के साथ इंटरनेट पर तैर रहा है जो 00किसी भी बाइटेड दशमलव मानों की अनुमति देता है डॉट-सीमांकित पता, जो अवैध है। इसके बाकी भाग RFC 5322 व्याकरण के अनुरूप प्रतीत होते हैं और कई परीक्षणों का उपयोग करते हुए गुजरते हैं grep -Po, जिनमें केस डोमेन नाम, आईपी पते, बुरे वाले और बिना उद्धरणों वाले खाता नाम शामिल हैं।

00आईपी ​​पैटर्न में बग को ठीक करते हुए , हम एक कामकाजी और काफी तेज रेगेक्स प्राप्त करते हैं। (वास्तविक कोड के लिए प्रदान किए गए संस्करण को परिमार्जन करें, अंकन नहीं।)

([एक-Z0-9 # $% & '* + / = ^ _ `{|} ~ - + (?।!: \ [एक-Z0-9 # $% &!]'? * + / ? = ^ _ `{|} ~ -] +) * |" (: [\ x01- \ x08 \ x0b \ x0c \ x0e- \ x1f \ x21 \ x23- \ x5b \ x5d- \ x7f] | \\ [\ x01- \ x09 \ x0b \ x0c \ x0e- \ x7f]) * ") @ (: (: [एक-Z0-9] (?? [एक-Z0-9 -] * [एक-z0 -9]) \) + [एक-Z0-9] (:।??? [एक-Z0-9 -] * [एक-Z0-9]) | \ [(:( :( 2 (5 [0-5] | [0-4] [0-9]) | 1 [0-9] [0-9] |?। [1-9] [0-9])) \) {3} ( ? :( 2 (5 [0-5] | [0-4] [0-9]) | 1 [0-9] [0-9] | [1-9] [0-9]) |? [ एक-Z0-9 -] * [एक-Z0-9]: (: [\ x01- \ x08 \ x0b \ x0c \ x0e- \ x1f \ x21- \ x5a \ x53- \ x7f] | \\ [\ x01- \ x09 \ x0b \ x0c \ x0e- \ x7f]) +) \])

या:

(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])

यहाँ ऊपर regexp के लिए परिमित राज्य मशीन का आरेख है जो स्वयं regexp से अधिक स्पष्ट है यहां छवि विवरण दर्ज करें

पर्ल और पीसीआरई (PHP में उदाहरण के लिए उपयोग की जाने वाली regex लाइब्रेरी) में अधिक परिष्कृत पैटर्न सही ढंग से अड़चन के बिना RFC 5322 को पार्स कर सकते हैं । पायथन और सी # भी ऐसा कर सकते हैं, लेकिन वे पहले दो से एक अलग वाक्यविन्यास का उपयोग करते हैं। हालांकि, यदि आप कई कम शक्तिशाली पैटर्न-मिलान भाषाओं में से एक का उपयोग करने के लिए मजबूर हैं, तो असली पार्सर का उपयोग करना सबसे अच्छा है।

यह समझना भी महत्वपूर्ण है कि RFC के अनुसार इसे मान्य करना आपको इस बारे में बिल्कुल कुछ नहीं बताता कि क्या वह पता वास्तव में आपूर्ति किए गए डोमेन पर मौजूद है, या क्या पता दर्ज करने वाला व्यक्ति इसका असली मालिक है। लोग दूसरों को हर समय इस तरह से मेलिंग सूचियों पर साइन अप करते हैं। फिक्सिंग जिसमें एक कट्टर प्रकार की मान्यता की आवश्यकता होती है, जिसमें उस पते को भेजने वाला संदेश शामिल होता है जिसमें एक पुष्टिकरण टोकन शामिल होता है जिसका अर्थ उसी वेब पेज पर दर्ज किया जाना चाहिए जैसा कि पता था।

यह जानने का एकमात्र तरीका है कि आपको प्रवेश करने वाले व्यक्ति का पता मिल गया है। यही कारण है कि अधिकांश मेलिंग सूचियाँ अब साइन-अप की पुष्टि करने के लिए उस तंत्र का उपयोग करती हैं। सब के बाद, कोई भी नीचे रख सकता है president@whitehouse.gov, और वह भी कानूनी रूप में पार्स करेगा, लेकिन दूसरे छोर पर व्यक्ति होने की संभावना नहीं है।

PHP के लिए, आपको PHP के साथ ई-मेल पते को सत्यापित करने में दिए गए पैटर्न का उपयोग नहीं करना चाहिए , जिस तरीके से मैं उद्धरण करता हूं:

कुछ खतरा है कि आम उपयोग और व्यापक मैला कोडिंग ई-मेल पते के लिए एक वास्तविक मानक स्थापित करेगा जो रिकॉर्ड किए गए औपचारिक मानक से अधिक प्रतिबंधात्मक है।

यह अन्य सभी गैर-आरएफसी पैटर्न से बेहतर नहीं है। यह RFC 822 को संभालने के लिए भी इतना स्मार्ट नहीं है , अकेले RFC 5322 को छोड़ दें। यह एक है , हालांकि।

यदि आप फैंसी और पांडित्य प्राप्त करना चाहते हैं, तो एक पूर्ण राज्य इंजन लागू करें । एक नियमित अभिव्यक्ति केवल एक अल्पविकसित फ़िल्टर के रूप में कार्य कर सकती है। नियमित अभिव्यक्तियों के साथ समस्या यह है कि किसी को यह बताना कि उनका पूरी तरह से वैध ई-मेल पता अमान्य है (एक गलत सकारात्मक) क्योंकि आपकी नियमित अभिव्यक्ति इसे संभाल नहीं सकती है यह उपयोगकर्ता के दृष्टिकोण से सिर्फ अशिष्ट और असभ्य है। इस उद्देश्य के लिए एक राज्य इंजन ई-मेल पते को मान्य और सही भी कर सकता है, जिसे अन्यथा अमान्य माना जाएगा क्योंकि यह प्रत्येक RFC के अनुसार ई-मेल पते को असम्बद्ध करता है। यह संभावित रूप से अधिक सुखदायक अनुभव के लिए अनुमति देता है, जैसे

निर्दिष्ट ई-मेल पता 'myemail @ पता, com' अमान्य है। क्या आपका मतलब 'myemail@address.com' था?

टिप्पणियों सहित ईमेल पते को मान्य करना भी देखें । या ई-मेल पते की तुलना नियमित अभिव्यक्तियों को मान्य करना

नियमित अभिव्यक्ति दृश्य

डीबगेजक्स डेमो


179
आपने कहा "कोई अच्छी नियमित अभिव्यक्ति नहीं है।" क्या यह सामान्य या ई-मेल पते के सत्यापन के लिए विशिष्ट है?
टॉमालक

37
@Tomalak: केवल ईमेल पतों के लिए। जैसा कि bortzmeyer ने कहा, RFC बेहद जटिल है
लुक

37
आपके द्वारा उल्लिखित लिनक्स जर्नल लेख कई मामलों में तथ्यात्मक रूप से गलत है। विशेष रूप से Lovell ने RFC3696 के इरेटा को स्पष्ट रूप से नहीं पढ़ा है और RFC के प्रकाशित संस्करण में कुछ त्रुटियों को दोहराता है। यहाँ और अधिक: dominicsayers.com/isemail
डोमिनिक Sayers 15

9
जेफ एटवुड के पास सभी मान्य ईमेल पतों को मान्य करने के लिए इस ब्लॉग पोस्ट में एक प्यारा रेगेक्स है: codinghorror.com/blog/2005/02/regex-use-vs-regex-abuse.html
CMircea

5
ध्यान दें कि वर्तमान HTML5 कल्पना में ईमेल प्रकार इनपुट सत्यापन के लिए एक regex और ABNF शामिल है जो मूल RFC की तुलना में जानबूझकर अधिक प्रतिबंधात्मक है।
सांच्रो

745

आपको ईमेल पतों को मान्य करने के लिए नियमित अभिव्यक्तियों का उपयोग नहीं करना चाहिए।

इसके बजाय, इस तरह MailAddress वर्ग का उपयोग करें:

try {
    address = new MailAddress(address).Address;
} catch(FormatException) {
    // address is invalid
}

MailAddressवर्ग RFC822 के साथ पूर्ण अनुसार पते को प्रमाणित करने के लिए एक BNF पार्सर का उपयोग करता है।

यदि आप MailAddressई-मेल पते को मान्य करने के लिए उपयोग करने की योजना बनाते हैं , तो ध्यान रखें कि यह दृष्टिकोण ई-मेल पते के प्रदर्शन नाम भाग को भी स्वीकार करता है, और यह वही नहीं हो सकता है जो आप प्राप्त करना चाहते हैं। उदाहरण के लिए, यह इन स्ट्रिंग्स को मान्य ई-मेल पते के रूप में स्वीकार करता है:

  • "user1@hotmail.com; user2@gmail.com"
  • "user1@hotmail.com; user2@gmail.com; user3@company.com"
  • "उपयोगकर्ता प्रदर्शन नाम user3@company.com"
  • "user4 @ company.com"

इनमें से कुछ मामलों में, स्ट्रिंग के अंतिम भाग को पते के रूप में पार्स किया जाता है; बाकी इससे पहले कि प्रदर्शन नाम है। किसी भी प्रदर्शन नाम के बिना एक सादा ई-मेल पता प्राप्त करने के लिए, आप अपने मूल स्ट्रिंग के खिलाफ सामान्यीकृत पते की जांच कर सकते हैं।

bool isValid = false;

try
{
    MailAddress address = new MailAddress(emailAddress);
    isValid = (address.Address == emailAddress);
    // or
    // isValid = string.IsNullOrEmpty(address.DisplayName);
}
catch (FormatException)
{
    // address is invalid
}

इसके अलावा, एक पते के अंत में एक डॉट है, जैसे user@company.MailAddress द्वारा भी स्वीकार किया जाता है।

यदि आप वास्तव में रेगेक्स का उपयोग करना चाहते हैं, तो यह है :

(??:? (?: \ r \ n)? [\ t]) * (?:? (?:? (?: [^ () <> @, ;: \\ "। \ [\ \] \ 000- \ 031 ] + (:?:?:? (?: \ r \ n)? [\ t]
(? = [\ [) + | | \ Z "() <> @,;: \\" \ [\]])) | "([^ \?" \ R \\] | \\।। |?:?: (?: \ r \ n)? [\ t])) * "(? :( ?:?)
\ r \ n)? [\ t]) *) (?: \ _? (?:? (?: \ r \ n)? [\ t]) * (?:? [^ () <> @, ?: \ \ "। \ [\] \ 000- \ 031] + (? :( ?: ?:(
?: \ r \ n)? [\ t]) + | \ Z | (? =? [\ _ "()> @,;: \\"। \ [[\]])) | " ^ \ "\ r \\] | \\ | (:।? (: \ r \ n) [? 
\ t])) * "(?:? (?: \ r \ n)? [\ t]) *)) * @ @ (?: ?:: (\ _ r \ n)? [\ t]) * (?: [^ () <> @ ;: \\ "। \ [\ \] \ 000- \ ०
३१] + (?: ?:?: (?: \ R \ n)? [\ T]) + | \ _ ९ (-? =? [[\ "() <> @;: \\"। \ [\ " ]])) | \ [([^ \ [\] \ r \\] |। \\) * \
]:??: (?: (\ r \ n)? [\ t]) *) (?: \ _? (?: (?: ?: \ r \ n)? [\ t]) * (?: [^)) <> @, ;: \\ "। \ [\ \" \ 000- \ 031] +
(??: (??:?: \ r \ n)? [\ t]) + | \ Z | ((=! [\ _ "() <> @; ;: \\"। \ [\]]) ) | \ [([^ \ [\] \ r \\] | \\) * \।] (?:
: (?: (?: \ r \ n)? [\ t]) + | \ Z
| (? = [\ [ "() <> @,;: \\"। \ [\]])।?) | "? ([^ \" \ R \\] | \\ | (:( ?: \ r \ n)? [\ t]) * * "(?:? (?: \ r \ n)?"
? [\ t]) *) * \ <(?:? (?: \ r \ n); [\ t]) * (?: @:?: (?: [^ () <> @,?: \\ "। \ [\] \ ०००- \ ०३१] + (?:? (?:? (?:)
r \ n); [\ t]) + | \ Z | (? = [\ _ "() <> @,;: \\"। \ [[\]])) | \ _ ([^ \ _ \ _] ] \ r \\] | \\) * \]। (? (: \ r \ n)? [
 \ t]) *) (?:?: \??:? (?: \ r \ n)? [\ t]) * (?:? [^ () <> @ ;: \\ "। \ [\]। \ 000- \ 031] (: (: (: \ r \ n)
; [\ t]) + | \ Z | (; = [\ _ "() <> @, ;: \\"। \ [\ _]]) | \ _ ([^ \ _ \ _ \ _ \ _] \]। \\।) * \] (?:? (?: \ r \ n)? [\ t]
) *)) * (: ?:, @ (?:? (?: \ r \ n)? [\ t]) * (?:? [^ () <> @;: \\ "। \ [\] \ _ 000- \ 031] (: (: (? \ r \ n) [
 \ T]) + | \ जेड | (=? [\ [ "() <> @,;: \\"। \ [\]])) | \ [([^ \ [\] \ R \\] | \ _।) * \] (?:? (?: \ r \ n)? [\ t]) *
) (?: \?!?:? (?: \ r \ n)? [\ t]) * (?: [^ () <> @, ;: \\ "। \ [\ \] \ 000- \ 031। ] + (:?:?:? (?: \ r \ n)? [\ t]
) + | \ जेड | (= [\ [? "() <> @,;: \\"। \ [\]])) | \ [([^ \ [\] \ R \\] | \\ )) * \] (?:? (?: \ r \ n)? [\ t]) *)) *)
*: (?:? (?: \ r \ n)? [\ t]) *)? (?: ?: [^ () <> @,: \\ "। \ [\ \] \ 000- \ 031] +। (?: (?: ?:?: \ r \ n)? [\ t]) +
| \ जेड | (= [\ [ "() <> @,;: \\"?। \ [\]])।) | "? ([^ \" \ R \\] | \\ | ( ?: (?: (\ r \ n)? [\ t]) * * "(?:? (?: \ r)
\ n); [\ t]) *) (?: \? (?:? (?: \ r \ n); [\ t]) * (?:? [^ () <> @, ;: \\ " । \ [\] \ 000- \ 031] + (? :(? :(?)
\ r \ n)? [\ t]) + | \ Z | (? = [\ _ "() <> @,?: \\"। \ [\ \]])) | "(?: [^ \ _] "\ r \\] | \\। | (?:? (?: \ r \ n)? [\ t]
])) * "(?:? (?: \ r \ n)? [\ t]) *)) * @ (?:?: (?: \ r \ n)? [\ t]) * (?: [^] () <> @ ;: \\ "। \ [\ \" \ 000- \ 031;
] + (?:? (?:? (?: \ r \ n)? [\ t]) + | \ Z | (? =? [[\ "() <> @;: \\"। \ [] ])) | \ [([^ \ [\] \ r \\] |। \\) * \] (
?:? (?: \ r \ n)? [\ t]) *) (?:?: \? (?:? (?: \ r \ n)? [\ t]) * (?:?] [^ () <> @,: \\ "। \ [\ \" \ 000- \ 031] + (?)
: (?: (?: (\ r \ n)? [\ t]) + | \ Z | (? =? [[\ "() <> @;: \\"। \ [\]]) | \ [([^ \ [\] \ r \\] |। \\) * \]? (:(?
: \ r \ n); [\ t]) *)) * \> (?:? (?: \ r \ n)? [\ t]) *) | | (?: [^ () <> @,; : \\ "। \ [\ \] \ 000- \ 031] + (? :(?)
: (?? \ r \ n)? [\ t]) + | \ Z | (? = [\ _ ["() <> @ ;: \\"। \ [[\]])] "(?) : [^ \ "\ r \\] | \\ | (:।? (: \ r \ n)?
[\ t])) * "(?:? (?: \ r \ n)? [\ t]) *) *:: (?:? (?: (\ _ r \ n)? [\ t]) * (?: ? (: (: [^ () <> @,;:। \\ "\ [\] 
\ 000- \ 031] + (?:? (?:? (\? R \ n); [\ t]) + | \ z9 ((? = [\ "" () <> @, ;: \\ " । \ [\]])) | "(? [^ \" \ r \\] |
\\।: (?:? (?: \ r \ n)? [\ t]) * * "(?: (?:? (\ r \ n)? [\ t]) *) (?: ?: (?) : (?? \ r \ n)? [\ t]) * (?: [^ () <>

@,: \\ "। \ [\ \" \ 000- \ 031] + (?:? (?:? (?: \ R \ n)? [\ T]) + | \ z | (? = [\] [] "() <> @,;: \\"। \ [\]])) | "
(?: [^ \ "\ r \\] | \\। | (?:? (?: (\ r \ n)? [\ t]) * *" (?:? (?: \ r \ n)?] \ t]) *)) * @ (?:? (?: \ r \ n)? [\ t]
) * (?: [^ () <> @ ;: \\ "। \ [\ \] \ 000- \ 0 0]] + (?: ?:? (?: ?: \ r \ n)? [\ T] + | \ जेड | (= [\ [ "() <> @,;: \\
"। \ [(\]])) | \ _ ([[\ _ \ _ \ _ \ _] | \ _।) * \"]: (?: ?: (\ _ r \ n)? [\ t] * * ) (?: \?!?:? (?: \ r \ n)? [\ t]) * (?
: [^ () <> @,? \\ "। \ [\ \" \ 000- \ 031] +?!?:? (?:? (?: \ R \ n)? [\ T]) + | \ Z ?। | (= [\ [ "() <> @,;: \\" \ [
\]])) | \ _ ([[\ _ \ _ \ _ \ _] | \\।) * \ _। ?:?:?: (?: \ r \ n)? [\ t]) *)) * | (?: [^ () <> @ ;: \\ "। \ [\ \] \ 000-
\ 031] + (?:? (?:? (?: \ R \ n)? [\ T]) +_ Z और | (? = [\ _ "() <> @, ;: \\"।] \]])) | "([^ \?" \ r \\] | \\ | (।
?: (?: (\ r \ n)? [\ t]) * * "(?:? (?:? \ r \ n)? [\ t]) *) * \ _ <(?:? (?: \ r \)? n); [\ t]) * (?: @ @?: [^ () <> @ ,;
: \\ "। \ [\ \" \ 000- \ 031] + (?:? (?:? (?: \ \ \ N)? [\ T]) + | \ z | (? =? [[\ ") () । <> @,;: \\ "\ [\]])) | \ [([
^ \ [[\] \ r \\] | \\।) * \] (?:? (?: \ r \ n)? [\ t]) *) (?:?: (?: ?: ?: \ r) \ n); [\ t]) * (?: [^ () <> @, ;: \\ "
। \ [[\] \ ०००- \ ०३१] + (?:? (?:? (\ R \ n)? [\ T]) + | \ Z | (? =? [[\] "() <> @ ;:। \\ "\ [\]])) | \ [([^ \ [\
] \ r \\] | \\।) * \] (?:? (?: \ r \ n)? [\ t]) *)) *: ?:, @ (?:? (?: \ r \ n)? )? [\ t]) * (?: [^ () <> @, ;: \\ "। \ _
[\] \ ०००- \ ०३१] + (?: (?:? (?: \ R \ n); [\ _]] + + \ z | (? =? [\ _ ’’ () <> @;; \\ "\ [\]])) |। \ [([^ \ [\] \
r \\]। \\।) * \] (?:? (?: \ r \ n)? [\ t] * *) (?: (\ ?: ?: ?: (?: \ r \ n)?] टी]) *: [<> @, (^ (।;: \\ "\ [\?)] 
\ 000- \ 031] + (?:? (?:? (\? R \ n); [\ t]) + | \ z9 ((? = [\ "" () <> @, ;: \\ " । \ [\]])) | \ [([^ \ [\] \ r \\]
| (\\।) * \] (?:? (?: \ r \ n)? [\ t]) *)) *) *::: (:?: (?:: \ r \ n)? [\ t] * * ); (?: [^ () <> @ ;: \\ "। \ [\ \] \ 0
00- \ 031] + (?: (?:? (?: \ R \ n)? [\ T]) = \ _ Z | और! =! [[\ "() <> @;;: \\"। \ [\]])) | "(? [^ \" \ r \\] | \\
। | (?:?: (?: \ r \ n)? [\ t]) * * "(?:? (?: (\ r \ n)? [\ t]) *) (?:?: \ _?: (?) ?: \ r \ n)? [\ t]) * (?: [^ () <> @?
;: \\ "। \ [\ \] \ 000- \ 031] + (?:? (?:? (?: \ \ \ N)? [\ T]) + | \ Z | (? =? [[\") ) <> @,;: "। \ [\]])) |" \\ (?
: [^ \ "\ r \\] | \\।? (?:? (?: \ r \ n)? [\ t]) * *":? (?: (?: \ r \ n)? [\ t )) *)) * @ (?:? (?: \ r \ n)? [\ t]) *
(?: [^ () <> @ ;: \\ "। \ [\ \] \ 000- \ 031] + (?:?: (?:: ?: \ r \ n)? [\ T]) +? \ जेड | (= [\ [ "() <> @,;: \\"?।
\ [[\]])) | \ _ ([[\ _ \ _ \ _ \ _] | \\।) \ _ \ _] (?:? (?: \ r \ n)? [\ t]) *) (?) ?: \??:? (?: \ r \ n)? [\ t]) * (?:?)
^ () <> @ ;: \\ "। \ [\ \] \ 000- \ 031] + (?:?:?: ?: ?: \ r \ n)? [\ T]) + | \ Z | ( ? = [\ [ "() <> @,;: \\"। \ [\]
])) | \ _ ([[\ _ \ _ \ _ \ _] | \\।) * \ _ ()?: (?: ?: \ r \ n)? [\ t]) *)) * \ _ (?) ?: (?: \ r \ n)? [\ t]) *) (?:, \ s * (
?:? (?: [^ () <> @ ;: \\ "। \ [\ \] \ 000- \ 0 0]] + (?: ?:? (?: ?: \ r \ n)? [\ T]। + | \ जेड | (= [\ [ "() <> @,;: \\
"। \ [[\]])]" "(?: [^ \" \ r \\] | \\ | -?:?: ?: ?: (\ _ r \ n)? [\ t]) * "(?) : (?? \ r \ n)? [\ t]) *) (?:?: \?: ?:
?: \ r \ n)? [\ t]) * (?: [^ () <> @,?: \\ "। \ [\ \] \ 000- \ 031] + (?:? :( ?:?) : \ r \ n)? [\ t]) + | \ Z | (? =?)
\ [ "() <> @,;: \\"। \ [\]]।?)) | "? ([^ \" \ R \\] | \\ | (: (: \ r \ n); [\ t])) * "(?:? (?: \ r \ n)? [\ t]
)) *)) * @ (?:? (?: \ r \ n)? [\ t]) * (?: [^ () <> @;: \\ "। \ [\ \] \ 000- \। 031] + (?:? (?:? (?: \ R \ n)? [\ T
]) + | \ जेड | (=? [\ [ "() <> @,;: \\"। \ [\]])) | \ [([^ \ [\] \ R \\] | \ \ (।) * \]?:? (?:? \ r \ n)? [\ t]) *) (?)
: \ _? (?: ?:? \ r \ n)? [\ t]) * (?: [^ ()>>:; \\ "। \ [\ \" \ 000- \ 031] + ()। ?: (?:?:?: \ r \ n)? [\ t]) + |
\ जेड | (= [\ [ "() <> @,;: \\"?। \ [\]])।) | \ [([^ \ [\] \ R \\] | \\) * \] (?:? (?: \ r \ n)? [\ t]) *)) * | (?:
[^ () <> @,; \\ "। \ [\ \" \ 000- \ 031] + (?:?: (?:: (\ _ r \ n)? [\ T]) + | \ Z | ? (= [\ [ "() <> @,;: \\"। \ [\
]])) |) "(?: ?: [^ \" \ r \\] | \\। | (?:? (?:? \ r \ n)? [\ t])) * "(?:? (?: \ _) r \ n)? [\ t]) *) * \ <(?:? (?: \ r \ n)
? [\ t]) * (?: @ (?: [^ () <> @ ;: \\ "। \ [\ \] \ 000- \ 031] + (?:? (?: ?: ?: r) \ n)? [\ t]) + | \ Z | (!? = [\ "
() <> @,;:।।? \\ "\ [\]])) | \ [([^ \ [\] \ r \\] | \\) * \] (: (: \ r \ n)? [\ t]) *) (?: \ _? (?:? (?: \ r \ n)?
? [\ t]) * (?: [^ () <> @;; \\ "। \ [\ \" \ 000- \ 031] + (?:? (?:? (?: \ r \ n))। [\ t]) + | \ Z | (? = [\ ["() <>

@,;:।।? \\ "\ [\]])) | \ [([^ \ [\] \ r \\] | \\) * \] (: (: \ r \ n)? [\ t]) *)) * (?:, @ (?:? (?: \ r \ n)?]
 \ t]) *:? (?: [^ () <> @;? \\ "। \ [\ \" \ 000- \ 031] + (?:? (?:? (?: \ r \ n)?] \ _ टी]) + | \ जेड | (? = [\ [ "() <> @,
;: \\ "। \ [\ _]]) | \ _ ([[\ _ \ _ \ _ \ _ \ _ | \ _ \ _। * *] (?:? (?: \ r \ n)? [\" t]) *) (?:?: (??:? (?: \ r \ n)? [\ t]
) * (?: [^ () <> @ ;: \\ "। \ [\ \] \ 000- \ 0 0]] + (?: ?:? (?: ?: \ r \ n)? [\ T] + | \ जेड | (= [\ [ "() <> @,;: \\
"। \ [(\]])) | \ _ ([[\ _ \ _ \ _ \ _] | \ _।) * \"]: (?: ?: (\ _ r \ n)? [\ t] * * )) *) *:: (?:? (?: \ r \ n)? [\ t]) *)?
(?: [^ () <> @ ;: \\ "। \ [\ \] \ 000- \ 031] + (?:?: (?:: ?: \ r \ n)? [\ T]) +? \ जेड | (= [\ [ "() <> @,;: \\"?।
\ [[\]])) | "(??: [^ \" \ r \\] | \\। | - (?:? (?:? \ r \ n)? [\ t])) * "(? :( ?: \ r \ n)? [\ t]) *) (?:?: \? (? :( ?:)
\ r \ n)? [\ t]) * (?: [^ () <> @ ;: \\ "। \ [\ \" \ 000- \ 031] + (?:?:? (?:? (?) r \ n)? [\ t]) + | \ Z | (! =! [\]
"() <> @,;: \\" \ [\]])) | "([^ \?" \ R \\] | \\ | (: (: \ r \ n।??)। ? [\ t])) * "(?:? (?: \ r \ n)? [\ t]"
*)) * @ (?:? (?: \ r \ n)? [\ t]) * (?: [^ () <> @, ;: \\ "। \ [\ \] \ 000- \ 031]। + +?: (?:? (?: \ r \ n)? [\ t])
+ | \ जेड | (= [\ [ "() <> @,;: \\"? \ [\]]।)) | \ [([^ \ [\] \ R \\] | \\। ) * \] (?:? (?: \ r \ n)? [\ t]) *) (?: \?)
।? (?: (?: \ r \ n)? [\ t]) * (?: [^ () <> @, ;: \\ "। \ [\ \] \ 000- \ 031] + (?:?) (?: (?: \ r \ n)? [\ t]) + | \ Z
| (? = [\ [ "() <> @,;: \\"। \ [\]])।) | \ [([^ \ [\] \ R \\] | \\) * \] (?: (?: \ r \ n)? [\ t]) *)) * \> (?:?
?: \ r \ n)? [\ t]) *)) *)?;? s *)

26
आप पाएंगे कि .NET 4.0 में MailAddress वर्ग पिछले संस्करणों की तुलना में ईमेल पते को मान्य करने में कहीं बेहतर है। मैंने इसमें कुछ महत्वपूर्ण सुधार किए।
जेफ टकर

7
मुझे लगता है कि यह ... काम नहीं करता है ... सरल आईडी के लिए। a @ b मान्य नहीं करता है। ar@b.com केवल @ b .com तक मेल खाता है .com मेल नहीं खाता है। हालाँकि, "I am me" @ [10.10.10.10] कुछ काम करता है! :)
उखेड़ना

5
चेतावनी दी है कि ये RFC आज्ञाकारी regex सत्यापनकर्ता बहुत से ऐसे ईमेल पतों के माध्यम से बताएंगे, जिन्हें आप संभवतः "a <body / onload = alert" (' lol.com?'+document.cookies ) Aaa> के रूप में स्वीकार नहीं करना चाहेंगे। "जो पर्ल के ईमेल में एक मान्य ईमेल पता है: मान्य (जो उस विशाल regex का उपयोग करता है), और XSS rt.cpan.org/Public/Bug/Display.html?id=75650
मैथ्यू

9
@MatthewLock: इससे बुरा कोई और नहीं है fake@not-a-real-domain.name। आप नहीं होना चाहिए XSS को रोकने के लिए ईमेल सत्यापन पर निर्भर हैं।
SLaks

10
@MatthewLock: नहीं। आपको एसक्यूएल के सवालों से बचना होगा (या, बेहतर अभी तक, मापदंडों का उपयोग करें)। स्वच्छता एक उचित बचाव नहीं है।
SLKs

535

यह प्रश्न बहुत कुछ पूछा जाता है, लेकिन मुझे लगता है कि आपको अपने कदम वापस लेने चाहिए और अपने आप से पूछना चाहिए कि आप ईमेल के विज्ञापनों को वाक्यविन्यास को मान्य क्यों करना चाहते हैं? वास्तव में लाभ क्या है?

  • यह सामान्य टाइपो को नहीं पकड़ेगा।
  • यह लोगों को अमान्य या बने-बनाए ईमेल पतों को दर्ज करने या किसी और के पते पर जाने से नहीं रोकता है।

यदि आप यह प्रमाणित करना चाहते हैं कि कोई ईमेल सही है, तो आपके पास पुष्टिकरण ईमेल भेजने और उपयोगकर्ता के पास इसका उत्तर देने के अलावा कोई विकल्प नहीं है। कई मामलों में आप होगा है सुरक्षा कारणों से या नैतिक कारणों के लिए वैसे भी एक पुष्टिकरण मेल भेजने के लिए (ताकि आप उनकी मर्जी के खिलाफ एक सेवा के लिए साइन अप नहीं किसी को जैसे सकते हैं)।


91
यह जाँचने योग्य हो सकता है कि उन्होंने साधारण गलतियों को पकड़ने के लिए क्लाइंट साइड सत्यापन में कुछ @ कुछ क्षेत्र में प्रवेश किया - लेकिन सामान्य तौर पर आप सही हैं।
मार्टिन बेकेट

8
मार्टिन, मैंने आपको एक +1 दिया, केवल बाद में पढ़ा कि foobar @ dk एक वैध ईमेल है। यह बहुत अच्छा नहीं होगा, लेकिन यदि आप दोनों RFC के अनुरूप होना चाहते हैं और सामान्य ज्ञान का उपयोग करना चाहते हैं, तो आपको ऐसे मामलों का पता लगाना चाहिए और उपयोगकर्ता से यह पुष्टि करने के लिए कहें कि यह सही है।
फिल्पेरो डे

105
@olavk: यदि कोई टाइपो में प्रवेश करता है (जैसे:) me@hotmail, तो वे स्पष्ट रूप से आपकी पुष्टिकरण ईमेल प्राप्त नहीं करेंगे, और फिर वे कहाँ हैं? वे आपकी साइट पर नहीं हैं और वे सोच रहे हैं कि वे साइन अप क्यों नहीं कर सकते। वास्तव में वे नहीं हैं - वे आपके बारे में पूरी तरह से भूल गए हैं। हालाँकि, यदि आप अभी भी अपने साथ रहने के दौरान रेगेक्स के साथ एक बुनियादी पवित्रता जांच कर सकते हैं, तो वे उस त्रुटि को सीधे पकड़ सकते हैं और आपको एक खुश उपयोगकर्ता मिल गया है।
निक नेन

5
@ जैक्सबी: आप एक उत्कृष्ट बिंदु बनाते हैं। सिर्फ इसलिए कि यह RFC प्रति मस्टर पास करता है इसका मतलब यह नहीं है कि यह वास्तव में उपयोगकर्ता का पता है। अन्यथा वे सभी president@whitehouse.govपते एक बहुत ही नेटबस कमांडर-इन-चीफ का संकेत देते हैं। :)
20

39
यह काला या सफेद होना जरूरी नहीं है। यदि ई-मेल गलत दिखता है, तो उपयोगकर्ता को यह बताएं। यदि उपयोगकर्ता अभी भी आगे बढ़ना चाहता है, तो उसे जाने दें। उपयोगकर्ता को अपने regex के अनुरूप करने के लिए बाध्य न करें, बल्कि, उपयोगकर्ता को यह जानने में मदद करने के लिए regex को एक उपकरण के रूप में उपयोग करें कि कोई गलती हो सकती है।
नवजानेर

354

यह सब इस बात पर निर्भर करता है कि आप कितना सही होना चाहते हैं। अपने उद्देश्यों के लिए, जहां मैं केवल चीजों को रखने की कोशिश कर रहा हूं bob @ aol.com(ईमेल में रिक्त स्थान) या steve(कोई डोमेन बिल्कुल नहीं) या mary@aolcom(.com से पहले कोई अवधि नहीं), मैं उपयोग करता हूं।

/^\S+@\S+\.\S+$/

ज़रूर, यह उन चीजों से मेल खाएगा जो मान्य ईमेल पते नहीं हैं, लेकिन यह सामान्य सरल त्रुटियों को प्राप्त करने की बात है।

उस regex में कुछ भी बदलाव किए जा सकते हैं (और कुछ इस उत्तर के लिए टिप्पणियों में हैं), लेकिन यह सरल, और समझने में आसान है, और यह एक अच्छा पहला प्रयास है।


6
यह फोब्बर @ डीके से मेल नहीं खाता है, जो एक वैध और काम करने वाला ईमेल पता है (हालांकि शायद ज्यादातर मेल सर्वर इसे स्वीकार नहीं करेंगे या कुछ जोड़ेंगे।)
bortzmeyer

3
हाँ यह होगा। मेरा सुझाव है कि आप इसे स्वयं आजमाएँ। $ perl -le'print qunningfoo@bar.co.uk} = ~ /^\S+@\S+\.\S+$/ q {Y}: q {N} '
एंडी लेस्टर

7
@ रीचर्ड: .में शामिल है \S
डेविड थॉर्नले

43
जेजे: हाँ, यह बहुत बकवास होगा। यह मेल करेगा & $ * # $ (@ $ 0 (%)) $ #।) और *) (* $, भी। मेरे लिए, मैं mary@aolcomपूरी तरह से बेकार कचरा -टाइपो-उंगली टाइपो को पकड़ने से ज्यादा चिंतित हूं, जैसे मैं पूरा कचरा हूं। । YMMV।
एंडी लेस्टर

5
बस @संकेतों के लिए नियंत्रण करने के लिए : /^[^\s@]+@[^\s@]+\.[^\s@]{2,}$/ jsfiddle.net/b9chris/mXB96
क्रिस मोसिनची

338

यह इस बात पर निर्भर करता है कि आपका सबसे अच्छा अर्थ क्या है: यदि आप हर वैध ईमेल पते को पकड़ने की बात कर रहे हैं, तो निम्नलिखित का उपयोग करें:

(?:(?:\r\n)?[ \t])*(?:(?:(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t]
)+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:
\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(
?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ 
\t]))*"(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\0
31]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\
](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+
(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:
(?:\r\n)?[ \t])*))*|(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z
|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)
?[ \t])*)*\<(?:(?:\r\n)?[ \t])*(?:@(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\
r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[
 \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)
?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t]
)*))*(?:,@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[
 \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*
)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t]
)+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*)
*:(?:(?:\r\n)?[ \t])*)?(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+
|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r
\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:
\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t
]))*"(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031
]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](
?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?
:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?
:\r\n)?[ \t])*))*\>(?:(?:\r\n)?[ \t])*)|(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?
:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?
[ \t]))*"(?:(?:\r\n)?[ \t])*)*:(?:(?:\r\n)?[ \t])*(?:(?:(?:[^()<>@,;:\\".\[\] 
\000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|
\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>
@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"
(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t]
)*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\
".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?
:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[
\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*|(?:[^()<>@,;:\\".\[\] \000-
\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(
?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)*\<(?:(?:\r\n)?[ \t])*(?:@(?:[^()<>@,;
:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([
^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\"
.\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\
]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*(?:,@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\
[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\
r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] 
\000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]
|\\.)*\](?:(?:\r\n)?[ \t])*))*)*:(?:(?:\r\n)?[ \t])*)?(?:[^()<>@,;:\\".\[\] \0
00-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\
.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,
;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?
:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t])*
(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".
\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[
^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]
]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*\>(?:(?:\r\n)?[ \t])*)(?:,\s*(
?:(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\
".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)(?:\.(?:(
?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[
\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t
])*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t
])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?
:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|
\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*|(?:
[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\
]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)*\<(?:(?:\r\n)
?[ \t])*(?:@(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["
()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)
?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>
@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*(?:,@(?:(?:\r\n)?[
 \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,
;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t]
)*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\
".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*)*:(?:(?:\r\n)?[ \t])*)?
(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".
\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)(?:\.(?:(?:
\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\[
"()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])
*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])
+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\
.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z
|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*\>(?:(
?:\r\n)?[ \t])*))*)?;\s*)

( http://www.ex-parrot.com/~pdw/Mail-RFC822-Address.html ) यदि आप कुछ सरल खोज रहे हैं, लेकिन जो सबसे मान्य ईमेल पते पकड़ लेगा, वह कुछ इस तरह आज़माएगा:

"^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$"

संपादित करें: लिंक से:

यह नियमित अभिव्यक्ति केवल उन पतों को मान्य करेगी जिनके पास कोई टिप्पणी छीनी गई है और उन्हें व्हाट्सएप से बदल दिया गया है (यह मॉड्यूल द्वारा किया गया है)।


10
यह सभी पतों से मेल नहीं खाता, कुछ को पहले रूपांतरित किया जाना चाहिए। लिंक से: "यह नियमित अभिव्यक्ति केवल उन पतों को मान्य करेगी जिनकी कोई टिप्पणी छीनी गई हो और उन्हें व्हाट्सएप से बदल दिया गया हो (यह मॉड्यूल द्वारा किया जाता है)।"
चास। ओवंस

47
क्या आप मुझे कुछ उदाहरण दे सकते हैं email addressजो गलत तरीके से दूसरे के माध्यम से गुजरता है, लेकिन लंबे रेगेक्स द्वारा पकड़ा जाता है?
लेज़र

4
हालांकि मैं एक बार इसे प्यार करता था, यह एक RFC 822 सत्यापनकर्ता है, न कि RFC 5322
tchrist

24
@Lazer in..valid @ example.com एक सरल उदाहरण होगा। आपको स्थानीय-भाग में लगातार दो अयोग्य डॉट्स रखने की अनुमति नहीं है।
रान्डल शवार्ट्ज

5
@ मिखाइल पर्ल, लेकिन आपको वास्तव में इसका उपयोग नहीं करना चाहिए।
अच्छा व्यक्ति

287

[अद्यतन] मैंने ईमेल पते के सत्यापन के बारे में जो कुछ भी मुझे पता है , उसे यहाँ संपादित किया है: http://isemail.info , जो अब न केवल मान्य करता है, बल्कि ईमेल पते की समस्याओं का भी निदान करता है। मैं यहां कई टिप्पणियों से सहमत हूं कि सत्यापन केवल उत्तर का हिस्सा है; http://isemail.info/about पर मेरा निबंध देखें

is_email () बना हुआ है, जहां तक ​​मुझे पता है, एकमात्र सत्यापनकर्ता जो आपको निश्चित रूप से बताएगा कि दिया गया स्ट्रिंग एक मान्य ईमेल पता है या नहीं। मैंने http://isemail.info/ पर एक नया संस्करण अपलोड किया है

मैंने कैल हेंडरसन, डेव चाइल्ड, फिल हैक, डग लोवेल, RFC5322 और RFC 3696 से परीक्षण के मामलों को समेटा। 275 सभी में परीक्षण के पते। मैंने इन सभी परीक्षणों को उन सभी निशुल्क सत्यापनकर्ताओं के खिलाफ चलाया, जिन्हें मैं पा सकता था।

मैं इस पृष्ठ को अप-टू-डेट रखने की कोशिश करूंगा क्योंकि लोग अपने सत्यापनकर्ताओं को बढ़ाते हैं। इन परीक्षणों और रचनात्मक आलोचनाओं के संकलन में मेरे सहयोग के लिए कैल, माइकल, डेव, पॉल और फिल का धन्यवाद और मेरे सर्वमान्य लेखक की रचनात्मक आलोचना ।

लोगों को विशेष रूप से RFC 3696 के खिलाफ इरेटा के बारे में पता होना चाहिए । विहित उदाहरणों में से तीन वास्तव में अमान्य पते हैं। और एक पते की अधिकतम लंबाई 254 या 256 वर्ण है, 320 नहीं


यह सत्यापनकर्ता भी सही लगता है। [... समय बीत जाता है ...] हम्म, ऐसा लगता है कि यह सिर्फ RFC 5322 है, 3693 या इरेटा नहीं है।
tchrist

1
बहुत अच्छा। यहां हमें न केवल एक अच्छा निबंध मिलता है, हमें एक सत्यापन परीक्षक के साथ-साथ एक पुस्तकालय भी डाउनलोड करने के लिए मिलता है। अच्छा उत्तर!
bgmCoder

आपका सत्यापनकर्ता पंचकोश (RFC 3492) का समर्थन नहीं करता है। name@öäü.at एक वैध पता हो सकता है। (यह नाम @xn--4ca9at.at पर अनुवादित है)
जोसेफ का कहना है कि मोनिका

हाय @ जोसेफ। name@xn--4ca9at.atइस कोड को मान्य करने के बारे में आपको व्याख्या करने की कोशिश करनी चाहिए, क्योंकि यह व्याख्या नहीं है। यदि आप एक पंचकोश अनुवादक जोड़ना चाहते हैं, तो मुझे github.com/dominicsayers/isemail
डोमिनिक सियर्स

266

प्रति W3C एचटीएमएल 5 कल्पना :

^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$

प्रसंग:

एक वैध ई-मेल पता एक स्ट्रिंग है जो ABNF उत्पादन […] से मेल खाता है।

नोट: यह आवश्यकता RFC 5322 का एक विलक्षण उल्लंघन है , जो ई-मेल पते के लिए एक वाक्यविन्यास को परिभाषित करता है जो एक साथ बहुत सख्त है ("@" वर्ण से पहले), बहुत अस्पष्ट ("@" चरित्र के बाद), और बहुत ही ढीला। टिप्पणियों, व्हाट्सएप पात्रों, और अधिकांश उपयोगकर्ताओं के लिए अपरिचित शिष्टाचार में उद्धृत तार) को यहां व्यावहारिक उपयोग के लिए अनुमति देता है।

निम्नलिखित जावास्क्रिप्ट- और पर्ल-संगत नियमित अभिव्यक्ति उपरोक्त परिभाषा का कार्यान्वयन है।

/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/


12
यह दिलचस्प है। यह RFC का उल्लंघन है, लेकिन एक दृढ़ इच्छाशक्ति है और यह तिल बनाता है। वास्तविक दुनिया उदाहरण: gmail @ से पहले वाले भाग में डॉट्स को अनदेखा करता है, इसलिए यदि आपका ईमेल test@gmail.com है, तो आप ईमेल को परीक्षण करने के लिए ईमेल कर सकते हैं। @ gmail.com या परीक्षण .... @ gmail.com, वे दोनों पते। RFC के अनुसार अमान्य है, लेकिन वास्तविक दुनिया में मान्य है।
वैलेंटाइनस

मेरे विचार से अंतिम भाग '*' के बजाय '+' होना चाहिए: ^ [a-zA-Z0-9! # $% & '* + / =? ^ _ `{|} ~ -] + @ [a- zA-Z0-9 -] + (?: \? [a-zA-Z0-9 -] +) + $
mmmmmm

7
@mmmmmm john.doe@localhostमान्य है। निश्चित रूप से, एक वास्तविक विश्व अनुप्रयोग (यानी एक समुदाय) में, मैं आपके सुझाव को * by +
rabudde

3
@valentinas वास्तव में, RFC इन स्थानीय भागों को शामिल नहीं करता है , लेकिन उन्हें उद्धृत किया जाना है। "test...."@gmail.comRFC के अनुसार पूरी तरह से मान्य है और शब्दार्थ के बराबर है test....@gmail.com
रिंकी

अगर मुझे a। @ या .. @ के साथ एक पते पर भेजने की कोशिश की जाती है तो मुझे अपनी कंपनी के रिले के माध्यम से अजगर का उपयोग करके ईमेल भेजने की कोशिश करते समय एक त्रुटि मिलती है। वास्तव में वह भी @ के मामले में है। मैं उन लोगों को भेजने से पहले हटा देता हूं जो यह विश्वास दिलाते हैं कि प्राप्तकर्ता इसे करेगा।
ndvo

201

यह पर्ल 5.10 या नए में आसान है:

/(?(DEFINE)
   (?<address>         (?&mailbox) | (?&group))
   (?<mailbox>         (?&name_addr) | (?&addr_spec))
   (?<name_addr>       (?&display_name)? (?&angle_addr))
   (?<angle_addr>      (?&CFWS)? < (?&addr_spec) > (?&CFWS)?)
   (?<group>           (?&display_name) : (?:(?&mailbox_list) | (?&CFWS))? ;
                                          (?&CFWS)?)
   (?<display_name>    (?&phrase))
   (?<mailbox_list>    (?&mailbox) (?: , (?&mailbox))*)

   (?<addr_spec>       (?&local_part) \@ (?&domain))
   (?<local_part>      (?&dot_atom) | (?&quoted_string))
   (?<domain>          (?&dot_atom) | (?&domain_literal))
   (?<domain_literal>  (?&CFWS)? \[ (?: (?&FWS)? (?&dcontent))* (?&FWS)?
                                 \] (?&CFWS)?)
   (?<dcontent>        (?&dtext) | (?&quoted_pair))
   (?<dtext>           (?&NO_WS_CTL) | [\x21-\x5a\x5e-\x7e])

   (?<atext>           (?&ALPHA) | (?&DIGIT) | [!#\$%&'*+-/=?^_`{|}~])
   (?<atom>            (?&CFWS)? (?&atext)+ (?&CFWS)?)
   (?<dot_atom>        (?&CFWS)? (?&dot_atom_text) (?&CFWS)?)
   (?<dot_atom_text>   (?&atext)+ (?: \. (?&atext)+)*)

   (?<text>            [\x01-\x09\x0b\x0c\x0e-\x7f])
   (?<quoted_pair>     \\ (?&text))

   (?<qtext>           (?&NO_WS_CTL) | [\x21\x23-\x5b\x5d-\x7e])
   (?<qcontent>        (?&qtext) | (?&quoted_pair))
   (?<quoted_string>   (?&CFWS)? (?&DQUOTE) (?:(?&FWS)? (?&qcontent))*
                        (?&FWS)? (?&DQUOTE) (?&CFWS)?)

   (?<word>            (?&atom) | (?&quoted_string))
   (?<phrase>          (?&word)+)

   # Folding white space
   (?<FWS>             (?: (?&WSP)* (?&CRLF))? (?&WSP)+)
   (?<ctext>           (?&NO_WS_CTL) | [\x21-\x27\x2a-\x5b\x5d-\x7e])
   (?<ccontent>        (?&ctext) | (?&quoted_pair) | (?&comment))
   (?<comment>         \( (?: (?&FWS)? (?&ccontent))* (?&FWS)? \) )
   (?<CFWS>            (?: (?&FWS)? (?&comment))*
                       (?: (?:(?&FWS)? (?&comment)) | (?&FWS)))

   # No whitespace control
   (?<NO_WS_CTL>       [\x01-\x08\x0b\x0c\x0e-\x1f\x7f])

   (?<ALPHA>           [A-Za-z])
   (?<DIGIT>           [0-9])
   (?<CRLF>            \x0d \x0a)
   (?<DQUOTE>          ")
   (?<WSP>             [\x20\x09])
 )

 (?&address)/x

20
इसे पाइथन में देखना पसंद करेंगे
tdc

4
मुझे लगता है कि केवल addrspecभाग का एक सबसेट वास्तव में प्रश्न के लिए प्रासंगिक है। इससे अधिक स्वीकार करना और इसे अग्रेषित करना हालांकि सिस्टम का कुछ अन्य हिस्सा जो पूर्ण RFC5822 पतों को स्वीकार करने के लिए तैयार नहीं है, शूटिंग के समान है।
dolmen

3
ग्रेट (+1) लेकिन तकनीकी रूप से यह निश्चित रूप से एक regex नहीं है ... (जो कि असंभव होगा क्योंकि व्याकरण नियमित नहीं है)।
रिंकी

10
regexes ने कुछ समय पहले नियमित होना बंद कर दिया। हालांकि यह एक वैध पर्ल 'रेगेक्स' है!
rjh

4
मैंने IDEone पर इस रेगेक्स के लिए एक परीक्षण स्थापित किया: ideone.com/2XFecH हालांकि, यह पूरी तरह से उचित नहीं है। " क्या किसी को झंकार करने की परवाह होगी? क्या मैं कुछ भूल रहा हूँ?
माइक

159

मैं उपयोग करता हूं

^\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$

कौन से ASP.NET में RegularExpressionValidator द्वारा उपयोग किया जाता है।


28
बू! मेरे (अ-सलाह) पते !@mydomain.netको अस्वीकार कर दिया गया है।
फ्रॉग्ज

3
इस पृष्ठ के अनुसार data.iana.org/TLD/tlds-alpha-by-domain.txt शीर्ष स्तर में केवल एक ही वर्ण के साथ कोई डोमेन नहीं है, जैसे "something.c", "something.a", यहाँ संस्करण है कि कम से कम 2 वर्णों का समर्थन करें: "some.pl", "something.us":^\\w+([-+.']\\w+)*@\\w+([-.]\\w+)*\\.\\w{2,}([-.]\\w+)*$
टॉमस ज़ुलक

4
@Wayne Whitty। आपने ईमेल के सत्यापन को छोड़कर, उन सभी पते, जिनमें से कोई भी उपयोग नहीं करता है, के विशाल बहुमत को पूरा करना है या नहीं, के प्राथमिक मुद्दे पर हिट किया है।
पतंजलि

आपके जवाब में @TomaszSzulc अतिरिक्त बैक स्लैश भ्रामक है, मैंने अभी इसे ठीक किया है और 2 वर्ण डोमेन नाम समर्थन काम कर रहा है, ^ \ w + ([- +।]] \ W +) * @ \ w + ([-] \ w +) *। \ _। \ w {2,} ([-।] \ w +) * $
अक़ीब मुमताज़

2
यह विफल हो जाता है simon-@hotmail.comजिस पर वास्तव में वैध है (हमारा एक ग्राहक का पता इसी तरह का था) `
सिमोन_वेर

142

सर्वश्रेष्ठ के बारे में नहीं जानते, लेकिन यह कम से कम सही है, जब तक कि पते उनके टिप्पणियों को हटा दिए गए हैं और उन्हें व्हाट्सएप से बदल दिया गया है।

गंभीरता से। ईमेल को मान्य करने के लिए आपको पहले से ही लिखित लाइब्रेरी का उपयोग करना चाहिए। सबसे अच्छा तरीका शायद उस पते पर एक सत्यापन ई-मेल भेजना है।


2
जहाँ तक मुझे पता है, कुछ पुस्तकालय गलत भी हैं। मुझे अस्पष्ट याद है कि PHP PEAR में ऐसा बग था।
bortzmeyer

उस पृष्ठ में नीचे से कुछ चीजों के बारे में एक अस्वीकरण भी है। कि regexp समर्थन नहीं करता है।
क्रिस वेस्ट

7
यह एक RFC 822 कल्पना है, RFC 5322 युक्ति नहीं।
tchrist

12
अंत में, वह सही है कि ईमेल पते को सही मायने में सत्यापित करने का एकमात्र तरीका यह है कि आप इसे एक ईमेल भेजें और उत्तर की प्रतीक्षा करें।
ब्लेज़ेमॉन्गर

109

जिन ईमेल पतों को मैं मान्य करना चाहता हूं, वे ASP.NET वेब एप्लिकेशन द्वारा System.Net.Mail नामस्थान का उपयोग करके लोगों की सूची में ईमेल भेजने के लिए उपयोग किए जाने वाले हैं। इसलिए, कुछ बहुत ही जटिल नियमित अभिव्यक्ति का उपयोग करने के बजाय, मैं सिर्फ पते से एक MailAddress उदाहरण बनाने की कोशिश करता हूं। यदि मेल ठीक से नहीं बना है तो MailAddress construtor अपवाद छोड़ देगा। इस तरह, मुझे पता है कि मैं कम से कम दरवाजे से ईमेल प्राप्त कर सकता हूं। बेशक यह सर्वर-साइड सत्यापन है, लेकिन कम से कम आपको वैसे भी इसकी आवश्यकता है।

protected void emailValidator_ServerValidate(object source, ServerValidateEventArgs args)
{
    try
    {
        var a = new MailAddress(txtEmail.Text);
    }
    catch (Exception ex)
    {
        args.IsValid = false;
        emailValidator.ErrorMessage = "email: " + ex.Message;
    }
}

3
एक अच्छा बिंदु। यहां तक ​​कि अगर यह सर्वर सत्यापन कुछ वैध पते को अस्वीकार करता है, तो यह कोई समस्या नहीं है क्योंकि आप इस पते पर इस विशेष सर्वर तकनीक का उपयोग करके इस पते पर नहीं भेज पाएंगे। या आप डिफ़ॉल्ट टूल के बजाय किसी भी तीसरे पक्ष के ईमेल लाइब्रेरी का उपयोग करके वही काम करने की कोशिश कर सकते हैं।
यूजर

मुझे वास्तव में पसंद है कि यह कैसे लाभ उठाता है। नेट फ्रेमवर्क कोड - पहिया को फिर से स्थापित करने में कोई मतलब नहीं है। यह उत्कृष्ट है। सरल, स्वच्छ और आपको वास्तव में ईमेल भेज सकते हैं। अच्छा कार्य।
कोरी हाउस

... हाँ और यह कैसे सत्यापित करता है में रुचि रखने वालों के लिए रिफ्लेक्टर में कोड पर एक नज़र है - इसमें काफी कुछ है - और यह एक नियमित अभिव्यक्ति नहीं है!
टॉम कार्टर

2
बस एक नोट: MailAddress वर्ग RFC5322 से मेल नहीं खाता है, यदि आप इसे केवल सत्यापन के लिए उपयोग करना चाहते हैं (और साथ ही नहीं भेज रहे हैं, तो उस स्थिति में यह एक उल्लिखित बिंदु है)। देखें: stackoverflow.com/questions/6023589/…
11'11

बस एक छोटी सी समस्या: यदि आप अपने सर्वर साइड वैलिडेटर कोड को अधिक पुन: प्रयोज्य बनाना चाहते हैं (या तो इस मामले में या आम तौर पर), तो मैं हार्ड-कोडित args.Valueजैसे फ़ील्ड को संदर्भित करने के बजाय उपयोग करने का सुझाव देता हूं txtEmail.Text। बाद वाला आपके सत्यापनकर्ता को एकल नियंत्रण उदाहरण के लिए बाध्य करेगा, जो ठीक हो सकता है, जब तक आपके पास एक एकल ई-मेल फ़ील्ड है, लेकिन अन्यथा अनुशंसित नहीं है।
फोलपर

109

शीघ्र जवाब

इनपुट सत्यापन के लिए निम्नलिखित रेगेक्स का उपयोग करें:

([-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*|"([]!#-[^-~ \t]|(\\[\t -~]))+")@[0-9A-Za-z]([0-9A-Za-z-]{0,61}[0-9A-Za-z])?(\.[0-9A-Za-z]([0-9A-Za-z-]{0,61}[0-9A-Za-z])?)+

इस regex द्वारा मिलान किए गए पते:

  • एक स्थानीय हिस्सा (यानी @ -साइन से पहले वाला हिस्सा) जो RFC 5321/5322 के साथ सख्ती से अनुपालन करता है,
  • एक डोमेन भाग (यानी @ -sign के बाद का हिस्सा) एक होस्ट नाम है जिसमें कम से कम दो लेबल होते हैं, जिनमें से प्रत्येक अधिक से अधिक 63 वर्णों का होता है।

दूसरा अवरोध RFC 5321/5322 पर प्रतिबंध है।

विस्तृत उत्तर

ईमेल पतों को पहचानने वाली एक नियमित अभिव्यक्ति का उपयोग करना विभिन्न स्थितियों में उपयोगी हो सकता है: उदाहरण के लिए किसी दस्तावेज़ में ईमेल पतों को स्कैन करने के लिए, उपयोगकर्ता इनपुट को मान्य करने के लिए, या डेटा रिपॉजिटरी में एक अखंडता बाधा के रूप में।

हालांकि यह ध्यान दिया जाना चाहिए कि यदि आप यह पता लगाना चाहते हैं कि क्या पता वास्तव में मौजूदा मेलबॉक्स को संदर्भित करता है, तो पते पर संदेश भेजने के लिए कोई विकल्प नहीं है। यदि आप केवल यह जांचना चाहते हैं कि क्या कोई पता व्याकरणिक रूप से सही है, तो आप एक नियमित अभिव्यक्ति का उपयोग कर सकते हैं, लेकिन ध्यान दें कि ""@[]एक व्याकरणिक रूप से सही ईमेल पता है जो निश्चित रूप से मौजूदा मेलबॉक्स का संदर्भ नहीं देता है।

ईमेल पतों के वाक्य-विन्यास को विभिन्न RFC में परिभाषित किया गया है , विशेष रूप से RFC 822 और RFC 5322 । RFC 822 को "मूल" मानक और RFC 5322 को नवीनतम मानक के रूप में देखा जाना चाहिए। RFC 822 में परिभाषित सिंटैक्स सबसे उदार है और बाद के मानकों ने सिंटैक्स को आगे और आगे प्रतिबंधित कर दिया है, जहां नई प्रणालियों या सेवाओं को अप्रचलित सिंटैक्स को पहचानना चाहिए, लेकिन कभी भी इसका उत्पादन नहीं करना चाहिए।

इस उत्तर में मैं addr-specRFC में परिभाषित के रूप में "ईमेल पता" ले जाऊंगा (यानी jdoe@example.org, लेकिन नहीं "John Doe"<jdoe@example.org>, न ही some-group:jdoe@example.org,mrx@exampel.org;)।

RFC सिंटैक्स को रेगेक्स में अनुवाद करने में एक समस्या है: सिंटैक्स नियमित नहीं होते हैं! ऐसा इसलिए है क्योंकि वे ईमेल पतों में वैकल्पिक टिप्पणियों के लिए अनुमति देते हैं जो असीम रूप से नेस्टेड हो सकते हैं, जबकि अनंत नेस्टिंग को एक नियमित अभिव्यक्ति द्वारा वर्णित नहीं किया जा सकता है। टिप्पणियों के लिए या मान्य पते स्कैन करने के लिए आपको एक पार्सर या अधिक शक्तिशाली अभिव्यक्ति की आवश्यकता होती है। (ध्यान दें कि पर्ल जैसी भाषाओं में संदर्भ मुक्त व्याकरणों का एक रेक्सक्स की तरह वर्णन करने के लिए निर्माण होता है।) इस उत्तर में मैं टिप्पणियों की अवहेलना करूंगा और केवल उचित नियमित भावों पर विचार करूंगा।

RFC ईमेल संदेशों के लिए वाक्यविन्यास को परिभाषित करता है, ईमेल पते के लिए नहीं। पते विभिन्न हेडर फ़ील्ड में दिखाई दे सकते हैं और यह वह जगह है जहाँ वे मुख्य रूप से परिभाषित होते हैं। जब वे हेडर फ़ील्ड में दिखाई देते हैं तो पते (लेक्सिकल टोकन के बीच) व्हाट्सएप, टिप्पणियां और यहां तक ​​कि लाइनब्रेक हो सकते हैं। शब्दार्थ इसका कोई महत्व नहीं है। इस व्हाट्सएप इत्यादि को एक पते से हटाकर, आप एक शब्दार्थ रूप से समकक्ष विहित प्रतिनिधित्व प्राप्त करते हैं । इस प्रकार, विहित प्रतिनिधित्व first. last (comment) @ [3.5.7.9]है first.last@[3.5.7.9]

विभिन्न उद्देश्यों के लिए अलग-अलग वाक्यविन्यास का उपयोग किया जाना चाहिए। यदि आप (संभवतः बहुत पुराने) दस्तावेज़ में ईमेल पते के लिए स्कैन करना चाहते हैं, तो यह RFC 822 में परिभाषित सिंटैक्स का उपयोग करने के लिए एक अच्छा विचार हो सकता है। दूसरी ओर, यदि आप उपयोगकर्ता इनपुट को मान्य करना चाहते हैं तो आप इसका उपयोग करना चाहते हैं। RFC 5322 में परिभाषित सिंटैक्स, शायद केवल कैनोनिकल अभ्यावेदन स्वीकार कर रहा है। आपको तय करना चाहिए कि आपके विशिष्ट मामले में कौन सा वाक्यविन्यास लागू होता है।

मैं इस जवाब में ASCII संगत वर्ण सेट मानकर POSIX "विस्तारित" नियमित अभिव्यक्ति का उपयोग करता हूं।

आरएफसी 822

मैं निम्नलिखित नियमित अभिव्यक्ति पर पहुंचा। मैं सभी को कोशिश करने और इसे तोड़ने के लिए आमंत्रित करता हूं। यदि आपको कोई झूठी सकारात्मक या गलत नकारात्मक मिलती है, तो कृपया उन्हें टिप्पणी में पोस्ट करें और मैं जल्द से जल्द अभिव्यक्ति को ठीक करने की कोशिश करूंगा।

([^][()<>@,;:\\". \x00-\x1F\x7F]+|"(\n|(\\\r)*([^"\\\r\n]|\\[^\r]))*(\\\r)*")(\.([^][()<>@,;:\\". \x00-\x1F\x7F]+|"(\n|(\\\r)*([^"\\\r\n]|\\[^\r]))*(\\\r)*"))*@([^][()<>@,;:\\". \x00-\x1F\x7F]+|\[(\n|(\\\r)*([^][\\\r\n]|\\[^\r]))*(\\\r)*])(\.([^][()<>@,;:\\". \x00-\x1F\x7F]+|\[(\n|(\\\r)*([^][\\\r\n]|\\[^\r]))*(\\\r)*]))*

मेरा मानना ​​है कि यह इरेटा सहित RFC 822 के साथ पूरी तरह से अनुकूल है । यह केवल ईमेल पते को उनके विहित रूप में पहचानता है। एक regex के लिए जो पहचानता है (तह) व्हाट्सएप नीचे दिए गए व्युत्पत्ति को देखता है।

व्युत्पत्ति से पता चलता है कि मैं अभिव्यक्ति में कैसे आया। मैं RFC से सभी प्रासंगिक व्याकरण नियमों को सूचीबद्ध करता हूं, जैसा कि वे दिखाई देते हैं, उसके बाद संबंधित रेगेक्स। जहां एक इरेटा प्रकाशित किया गया है, मैं सही व्याकरण नियम ("इरेटम" के रूप में चिह्नित) के लिए एक अलग अभिव्यक्ति देता हूं और बाद के नियमित अभिव्यक्तियों में अपडेट किए गए संस्करण को सब-डेप्रिसिएशन के रूप में उपयोग करता हूं।

जैसा कि पैरा 3.1.4 में कहा गया है। RFC 822 वैकल्पिक रैखिक सफेद स्थान को लेक्सिकल टोकन के बीच डाला जा सकता है। जहां लागू हो, मैंने इस नियम को समायोजित करने के लिए भावों का विस्तार किया है और "ऑप्ट-lwsp" के साथ परिणाम को चिह्नित किया है।

CHAR        =  <any ASCII character>
            =~ .

CTL         =  <any ASCII control character and DEL>
            =~ [\x00-\x1F\x7F]

CR          =  <ASCII CR, carriage return>
            =~ \r

LF          =  <ASCII LF, linefeed>
            =~ \n

SPACE       =  <ASCII SP, space>
            =~  

HTAB        =  <ASCII HT, horizontal-tab>
            =~ \t

<">         =  <ASCII quote mark>
            =~ "

CRLF        =  CR LF
            =~ \r\n

LWSP-char   =  SPACE / HTAB
            =~ [ \t]

linear-white-space =  1*([CRLF] LWSP-char)
                   =~ ((\r\n)?[ \t])+

specials    =  "(" / ")" / "<" / ">" / "@" /  "," / ";" / ":" / "\" / <"> /  "." / "[" / "]"
            =~ [][()<>@,;:\\".]

quoted-pair =  "\" CHAR
            =~ \\.

qtext       =  <any CHAR excepting <">, "\" & CR, and including linear-white-space>
            =~ [^"\\\r]|((\r\n)?[ \t])+

dtext       =  <any CHAR excluding "[", "]", "\" & CR, & including linear-white-space>
            =~ [^][\\\r]|((\r\n)?[ \t])+

quoted-string  =  <"> *(qtext|quoted-pair) <">
               =~ "([^"\\\r]|((\r\n)?[ \t])|\\.)*"
(erratum)      =~ "(\n|(\\\r)*([^"\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*"

domain-literal =  "[" *(dtext|quoted-pair) "]"
               =~ \[([^][\\\r]|((\r\n)?[ \t])|\\.)*]
(erratum)      =~ \[(\n|(\\\r)*([^][\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*]

atom        =  1*<any CHAR except specials, SPACE and CTLs>
            =~ [^][()<>@,;:\\". \x00-\x1F\x7F]+

word        =  atom / quoted-string
            =~ [^][()<>@,;:\\". \x00-\x1F\x7F]+|"(\n|(\\\r)*([^"\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*"

domain-ref  =  atom

sub-domain  =  domain-ref / domain-literal
            =~ [^][()<>@,;:\\". \x00-\x1F\x7F]+|\[(\n|(\\\r)*([^][\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*]

local-part  =  word *("." word)
            =~ ([^][()<>@,;:\\". \x00-\x1F\x7F]+|"(\n|(\\\r)*([^"\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*")(\.([^][()<>@,;:\\". \x00-\x1F\x7F]+|"(\n|(\\\r)*([^"\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*"))*
(opt-lwsp)  =~ ([^][()<>@,;:\\". \x00-\x1F\x7F]+|"(\n|(\\\r)*([^"\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*")(((\r\n)?[ \t])*\.((\r\n)?[ \t])*([^][()<>@,;:\\". \x00-\x1F\x7F]+|"(\n|(\\\r)*([^"\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*"))*

domain      =  sub-domain *("." sub-domain)
            =~ ([^][()<>@,;:\\". \x00-\x1F\x7F]+|\[(\n|(\\\r)*([^][\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*])(\.([^][()<>@,;:\\". \x00-\x1F\x7F]+|\[(\n|(\\\r)*([^][\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*]))*
(opt-lwsp)  =~ ([^][()<>@,;:\\". \x00-\x1F\x7F]+|\[(\n|(\\\r)*([^][\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*])(((\r\n)?[ \t])*\.((\r\n)?[ \t])*([^][()<>@,;:\\". \x00-\x1F\x7F]+|\[(\n|(\\\r)*([^][\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*]))*

addr-spec   =  local-part "@" domain
            =~ ([^][()<>@,;:\\". \x00-\x1F\x7F]+|"(\n|(\\\r)*([^"\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*")(\.([^][()<>@,;:\\". \x00-\x1F\x7F]+|"(\n|(\\\r)*([^"\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*"))*@([^][()<>@,;:\\". \x00-\x1F\x7F]+|\[(\n|(\\\r)*([^][\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*])(\.([^][()<>@,;:\\". \x00-\x1F\x7F]+|\[(\n|(\\\r)*([^][\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*]))*
(opt-lwsp)  =~ ([^][()<>@,;:\\". \x00-\x1F\x7F]+|"(\n|(\\\r)*([^"\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*")((\r\n)?[ \t])*(\.((\r\n)?[ \t])*([^][()<>@,;:\\". \x00-\x1F\x7F]+|"(\n|(\\\r)*([^"\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*")((\r\n)?[ \t])*)*@((\r\n)?[ \t])*([^][()<>@,;:\\". \x00-\x1F\x7F]+|\[(\n|(\\\r)*([^][\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*])(((\r\n)?[ \t])*\.((\r\n)?[ \t])*([^][()<>@,;:\\". \x00-\x1F\x7F]+|\[(\n|(\\\r)*([^][\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*]))*
(canonical) =~ ([^][()<>@,;:\\". \x00-\x1F\x7F]+|"(\n|(\\\r)*([^"\\\r\n]|\\[^\r]))*(\\\r)*")(\.([^][()<>@,;:\\". \x00-\x1F\x7F]+|"(\n|(\\\r)*([^"\\\r\n]|\\[^\r]))*(\\\r)*"))*@([^][()<>@,;:\\". \x00-\x1F\x7F]+|\[(\n|(\\\r)*([^][\\\r\n]|\\[^\r]))*(\\\r)*])(\.([^][()<>@,;:\\". \x00-\x1F\x7F]+|\[(\n|(\\\r)*([^][\\\r\n]|\\[^\r]))*(\\\r)*]))*

RFC 5322

मैं निम्नलिखित नियमित अभिव्यक्ति पर पहुंचा। मैं सभी को कोशिश करने और इसे तोड़ने के लिए आमंत्रित करता हूं। यदि आपको कोई झूठी सकारात्मक या गलत नकारात्मक मिलती है, तो कृपया उन्हें टिप्पणी में पोस्ट करें और मैं जल्द से जल्द अभिव्यक्ति को ठीक करने की कोशिश करूंगा।

([-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*|"([]!#-[^-~ \t]|(\\[\t -~]))+")@([-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*|\[[\t -Z^-~]*])

मेरा मानना ​​है कि यह इरेटा सहित RFC 5322 के साथ पूरी तरह से अनुकूल है । यह केवल ईमेल पते को उनके विहित रूप में पहचानता है। एक regex के लिए जो पहचानता है (तह) व्हाट्सएप नीचे दिए गए व्युत्पत्ति को देखता है।

व्युत्पत्ति से पता चलता है कि मैं अभिव्यक्ति में कैसे आया। मैं RFC से सभी प्रासंगिक व्याकरण नियमों को सूचीबद्ध करता हूं, जैसा कि वे दिखाई देते हैं, उसके बाद संबंधित रेगेक्स। ऐसे नियमों के लिए जिनमें शब्दशः अप्रासंगिक (फोल्डिंग) व्हाट्सएप शामिल है, मैं एक अलग रेग्क्स चिह्नित "(सामान्यीकृत)" देता हूं जो इस व्हाट्सएप को स्वीकार नहीं करता है।

मैंने RFC के सभी "अवलोकन" नियमों को अनदेखा किया। इसका मतलब यह है कि रेग्जेस केवल उन ईमेल पतों से मेल खाते हैं जो RFC 5322 के अनुरूप हैं। यदि आपको "पुराने" पतों ("जुनूनी" नियमों सहित शिथिल व्याकरण के रूप में) से मेल खाना है, तो आप पिछले पैराग्राफ से RFC 822 रेगेक्स में से एक का उपयोग कर सकते हैं।

VCHAR           =   %x21-7E
                =~  [!-~]

ALPHA           =   %x41-5A / %x61-7A
                =~  [A-Za-z]

DIGIT           =   %x30-39
                =~  [0-9]

HTAB            =   %x09
                =~  \t

CR              =   %x0D
                =~  \r

LF              =   %x0A
                =~  \n

SP              =   %x20
                =~  

DQUOTE          =   %x22
                =~  "

CRLF            =   CR LF
                =~  \r\n

WSP             =   SP / HTAB
                =~  [\t ]

quoted-pair     =   "\" (VCHAR / WSP)
                =~  \\[\t -~]

FWS             =   ([*WSP CRLF] 1*WSP)
                =~  ([\t ]*\r\n)?[\t ]+

ctext           =   %d33-39 / %d42-91 / %d93-126
                =~  []!-'*-[^-~]

("comment" is left out in the regex)
ccontent        =   ctext / quoted-pair / comment
                =~  []!-'*-[^-~]|(\\[\t -~])

(not regular)
comment         =   "(" *([FWS] ccontent) [FWS] ")"

(is equivalent to FWS when leaving out comments)
CFWS            =   (1*([FWS] comment) [FWS]) / FWS
                =~  ([\t ]*\r\n)?[\t ]+

atext           =   ALPHA / DIGIT / "!" / "#" / "$" / "%" / "&" / "'" / "*" / "+" / "-" / "/" / "=" / "?" / "^" / "_" / "`" / "{" / "|" / "}" / "~"
                =~  [-!#-'*+/-9=?A-Z^-~]

dot-atom-text   =   1*atext *("." 1*atext)
                =~  [-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*

dot-atom        =   [CFWS] dot-atom-text [CFWS]
                =~  (([\t ]*\r\n)?[\t ]+)?[-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*(([\t ]*\r\n)?[\t ]+)?
(normalized)    =~  [-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*

qtext           =   %d33 / %d35-91 / %d93-126
                =~  []!#-[^-~]

qcontent        =   qtext / quoted-pair
                =~  []!#-[^-~]|(\\[\t -~])

(erratum)
quoted-string   =   [CFWS] DQUOTE ((1*([FWS] qcontent) [FWS]) / FWS) DQUOTE [CFWS]
                =~  (([\t ]*\r\n)?[\t ]+)?"(((([\t ]*\r\n)?[\t ]+)?([]!#-[^-~]|(\\[\t -~])))+(([\t ]*\r\n)?[\t ]+)?|(([\t ]*\r\n)?[\t ]+)?)"(([\t ]*\r\n)?[\t ]+)?
(normalized)    =~  "([]!#-[^-~ \t]|(\\[\t -~]))+"

dtext           =   %d33-90 / %d94-126
                =~  [!-Z^-~]

domain-literal  =   [CFWS] "[" *([FWS] dtext) [FWS] "]" [CFWS]
                =~  (([\t ]*\r\n)?[\t ]+)?\[((([\t ]*\r\n)?[\t ]+)?[!-Z^-~])*(([\t ]*\r\n)?[\t ]+)?](([\t ]*\r\n)?[\t ]+)?
(normalized)    =~  \[[\t -Z^-~]*]

local-part      =   dot-atom / quoted-string
                =~  (([\t ]*\r\n)?[\t ]+)?[-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*(([\t ]*\r\n)?[\t ]+)?|(([\t ]*\r\n)?[\t ]+)?"(((([\t ]*\r\n)?[\t ]+)?([]!#-[^-~]|(\\[\t -~])))+(([\t ]*\r\n)?[\t ]+)?|(([\t ]*\r\n)?[\t ]+)?)"(([\t ]*\r\n)?[\t ]+)?
(normalized)    =~  [-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*|"([]!#-[^-~ \t]|(\\[\t -~]))+"

domain          =   dot-atom / domain-literal
                =~  (([\t ]*\r\n)?[\t ]+)?[-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*(([\t ]*\r\n)?[\t ]+)?|(([\t ]*\r\n)?[\t ]+)?\[((([\t ]*\r\n)?[\t ]+)?[!-Z^-~])*(([\t ]*\r\n)?[\t ]+)?](([\t ]*\r\n)?[\t ]+)?
(normalized)    =~  [-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*|\[[\t -Z^-~]*]

addr-spec       =   local-part "@" domain
                =~  ((([\t ]*\r\n)?[\t ]+)?[-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*(([\t ]*\r\n)?[\t ]+)?|(([\t ]*\r\n)?[\t ]+)?"(((([\t ]*\r\n)?[\t ]+)?([]!#-[^-~]|(\\[\t -~])))+(([\t ]*\r\n)?[\t ]+)?|(([\t ]*\r\n)?[\t ]+)?)"(([\t ]*\r\n)?[\t ]+)?)@((([\t ]*\r\n)?[\t ]+)?[-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*(([\t ]*\r\n)?[\t ]+)?|(([\t ]*\r\n)?[\t ]+)?\[((([\t ]*\r\n)?[\t ]+)?[!-Z^-~])*(([\t ]*\r\n)?[\t ]+)?](([\t ]*\r\n)?[\t ]+)?)
(normalized)    =~  ([-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*|"([]!#-[^-~ \t]|(\\[\t -~]))+")@([-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*|\[[\t -Z^-~]*])

ध्यान दें कि कुछ स्रोत (विशेष रूप से w3c ) का दावा है कि RFC 5322 स्थानीय भाग (यानी @ -साइन से पहले वाला हिस्सा) पर बहुत सख्त है। ऐसा इसलिए है क्योंकि "..", "ए .. बी" और "ए।" हैं वैध डॉट परमाणुओं, जबकि वे मेलबॉक्स नाम के रूप में इस्तेमाल किया जा सकता है। आरएफसी, तथापि, करता है इस तरह के स्थानीय भागों के लिए अनुमति देते हैं, सिवाय इसके कि वे उद्धृत किया जाना करने के लिए है। इसलिए इसके बजाय a..b@example.netआपको लिखना चाहिए "a..b"@example.net, जो शब्दार्थ के समकक्ष है।

आगे प्रतिबंध

SMTP (जैसा कि RFC 5321 में परिभाषित किया गया है ) आगे मान्य ईमेल पतों (या वास्तव में: मेलबॉक्स नाम) के सेट को प्रतिबंधित करता है। इस कड़े व्याकरण को थोपना उचित प्रतीत होता है, ताकि मेल किए गए ईमेल पते का उपयोग वास्तव में ईमेल भेजने के लिए किया जा सके।

RFC 5321 मूल रूप से "स्थानीय" भाग (यानी @ -sign से पहले वाला हिस्सा) को छोड़ देता है, लेकिन डोमेन भाग (यानी @ -sign के बाद वाला भाग) पर कठोर है। यह केवल डोमेन नाम के स्थान पर डॉट-परमाणुओं और एड्रेस शाब्दिकों के स्थान पर होस्ट नामों की अनुमति देता है।

RFC 5321 में प्रस्तुत व्याकरण तब बहुत हल्का होता है जब यह होस्ट नाम और IP पते दोनों के लिए आता है। मैंने इस ड्राफ्ट और RFC 1034 को दिशा-निर्देशों के रूप में उपयोग करते हुए, नियमों को "सही" करने की स्वतंत्रता ली । यहाँ परिणामी रेगेक्स है।

([-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*|"([]!#-[^-~ \t]|(\\[\t -~]))+")@([0-9A-Za-z]([0-9A-Za-z-]{0,61}[0-9A-Za-z])?(\.[0-9A-Za-z]([0-9A-Za-z-]{0,61}[0-9A-Za-z])?)*|\[((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|IPv6:((((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){6}|::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){5}|[0-9A-Fa-f]{0,4}::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){4}|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):)?(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){3}|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,2}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){2}|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,3}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,4}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::)((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3})|(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3})|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,5}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3})|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,6}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::)|(?!IPv6:)[0-9A-Za-z-]*[0-9A-Za-z]:[!-Z^-~]+)])

ध्यान दें कि उपयोग के मामले के आधार पर आप अपने रेगेक्स में "सामान्य-पता-शाब्दिक" के लिए अनुमति नहीं देना चाहते हैं। यह भी ध्यान दें कि मैंने (?!IPv6:)विकृत आईपीवी 6 पतों से मिलान करने के लिए "सामान्य-पता-शाब्दिक" भाग को रोकने के लिए अंतिम रेगेक्स में एक नकारात्मक रूपांतर का उपयोग किया था। कुछ रेगेक्स प्रोसेसर नकारात्मक लुकहेड का समर्थन नहीं करते हैं। |(?!IPv6:)[0-9A-Za-z-]*[0-9A-Za-z]:[!-Z^-~]+यदि आप पूरे "सामान्य-पता-शाब्दिक" भाग को बाहर निकालना चाहते हैं, तो रेगेक्स से सबस्ट्रिंग निकालें ।

यहाँ व्युत्पत्ति है:

Let-dig         =   ALPHA / DIGIT
                =~  [0-9A-Za-z]

Ldh-str         =   *( ALPHA / DIGIT / "-" ) Let-dig
                =~  [0-9A-Za-z-]*[0-9A-Za-z]

(regex is updated to make sure sub-domains are max. 63 charactes long - RFC 1034 section 3.5)
sub-domain      =   Let-dig [Ldh-str]
                =~  [0-9A-Za-z]([0-9A-Za-z-]{0,61}[0-9A-Za-z])?

Domain          =   sub-domain *("." sub-domain)
                =~  [0-9A-Za-z]([0-9A-Za-z-]{0,61}[0-9A-Za-z])?(\.[0-9A-Za-z]([0-9A-Za-z-]{0,61}[0-9A-Za-z])?)*

Snum            =   1*3DIGIT
                =~  [0-9]{1,3}

(suggested replacement for "Snum")
ip4-octet       =   DIGIT / %x31-39 DIGIT / "1" 2DIGIT / "2" %x30-34 DIGIT / "25" %x30-35
                =~  25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9]

IPv4-address-literal    =   Snum 3("."  Snum)
                        =~  [0-9]{1,3}(\.[0-9]{1,3}){3}

(suggested replacement for "IPv4-address-literal")
ip4-address     =   ip4-octet 3("." ip4-octet)
                =~  (25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}

(suggested replacement for "IPv6-hex")
ip6-h16         =   "0" / ( (%x49-57 / %x65-70 /%x97-102) 0*3(%x48-57 / %x65-70 /%x97-102) )
                =~  0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}

(not from RFC)
ls32            =   ip6-h16 ":" ip6-h16 / ip4-address
                =~  (0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3})|(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}

(suggested replacement of "IPv6-addr")
ip6-address     =                                      6(ip6-h16 ":") ls32
                    /                             "::" 5(ip6-h16 ":") ls32
                    / [                 ip6-h16 ] "::" 4(ip6-h16 ":") ls32
                    / [ *1(ip6-h16 ":") ip6-h16 ] "::" 3(ip6-h16 ":") ls32
                    / [ *2(ip6-h16 ":") ip6-h16 ] "::" 2(ip6-h16 ":") ls32
                    / [ *3(ip6-h16 ":") ip6-h16 ] "::"   ip6-h16 ":"  ls32
                    / [ *4(ip6-h16 ":") ip6-h16 ] "::"                ls32
                    / [ *5(ip6-h16 ":") ip6-h16 ] "::"   ip6-h16
                    / [ *6(ip6-h16 ":") ip6-h16 ] "::"
                =~  (((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){6}|::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){5}|[0-9A-Fa-f]{0,4}::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){4}|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):)?(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){3}|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,2}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){2}|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,3}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,4}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::)((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3})|(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3})|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,5}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3})|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,6}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::

IPv6-address-literal    =   "IPv6:" ip6-address
                        =~  IPv6:((((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){6}|::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){5}|[0-9A-Fa-f]{0,4}::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){4}|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):)?(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){3}|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,2}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){2}|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,3}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,4}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::)((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3})|(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3})|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,5}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3})|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,6}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::)

Standardized-tag        =   Ldh-str
                        =~  [0-9A-Za-z-]*[0-9A-Za-z]

dcontent        =   %d33-90 / %d94-126
                =~  [!-Z^-~]

General-address-literal =   Standardized-tag ":" 1*dcontent
                        =~  [0-9A-Za-z-]*[0-9A-Za-z]:[!-Z^-~]+

address-literal =   "[" ( IPv4-address-literal / IPv6-address-literal / General-address-literal ) "]"
                =~  \[((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|IPv6:((((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){6}|::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){5}|[0-9A-Fa-f]{0,4}::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){4}|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):)?(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){3}|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,2}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){2}|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,3}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,4}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::)((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3})|(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3})|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,5}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3})|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,6}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::)|(?!IPv6:)[0-9A-Za-z-]*[0-9A-Za-z]:[!-Z^-~]+)]

Mailbox         =   Local-part "@" ( Domain / address-literal )
                =~  ([-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*|"([]!#-[^-~ \t]|(\\[\t -~]))+")@([0-9A-Za-z]([0-9A-Za-z-]{0,61}[0-9A-Za-z])?(\.[0-9A-Za-z]([0-9A-Za-z-]{0,61}[0-9A-Za-z])?)*|\[((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|IPv6:((((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){6}|::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){5}|[0-9A-Fa-f]{0,4}::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){4}|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):)?(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){3}|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,2}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){2}|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,3}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,4}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::)((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3})|(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3})|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,5}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3})|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,6}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::)|(?!IPv6:)[0-9A-Za-z-]*[0-9A-Za-z]:[!-Z^-~]+)])

उपयोगकर्ता इनपुट सत्यापन

एक सामान्य उपयोग का मामला उपयोगकर्ता इनपुट सत्यापन है, उदाहरण के लिए HTML फॉर्म। उस स्थिति में यह आमतौर पर पता-शाब्दिकों को छोड़ने और होस्टनाम में कम से कम दो लेबल लगाने के लिए उचित है। एक आधार के रूप में पिछले भाग से बेहतर RFC 5321 regex लेते हुए, परिणामी अभिव्यक्ति होगी:

([-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*|"([]!#-[^-~ \t]|(\\[\t -~]))+")@[0-9A-Za-z]([0-9A-Za-z-]{0,61}[0-9A-Za-z])?(\.[0-9A-Za-z]([0-9A-Za-z-]{0,61}[0-9A-Za-z])?)+

मैं स्थानीय भाग को आगे प्रतिबंधित करने की सलाह नहीं देता, जैसे कि उद्धृत स्ट्रिंग को छोड़कर, क्योंकि हम नहीं जानते कि किस प्रकार के मेलबॉक्स कुछ मेजबान को अनुमति देते हैं (जैसे "a..b"@example.netया भी "a b"@example.net)।

मैं शाब्दिक शीर्ष-स्तरीय डोमेन की सूची या लंबाई-बाधाओं को लागू करने के खिलाफ स्पष्ट रूप से मान्य करने की अनुशंसा नहीं करता हूं (याद रखें कि कैसे ".Museum" अमान्य है [a-z]{2,4}), लेकिन अगर आपको यह करना चाहिए:

([-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*|"([]!#-[^-~ \t]|(\\[\t -~]))+")@([0-9A-Za-z]([0-9A-Za-z-]{0,61}[0-9A-Za-z])?\.)*(net|org|com|info|आदि...)

यदि आप स्पष्ट शीर्ष-स्तरीय डोमेन सत्यापन के पथ से नीचे जाने का निर्णय लेते हैं, तो अपने regex को अद्यतित रखना सुनिश्चित करें।

आगे के विचार

जब केवल डोमेन भाग (@ -sign के बाद) में होस्ट नामों को स्वीकार कर रहे हैं, तो ऊपर दिए गए संदर्भ केवल 63 अक्षरों के साथ केवल लेबल को स्वीकार करते हैं, जैसा कि उन्हें करना चाहिए। हालांकि, वे इस तथ्य को लागू नहीं करते हैं कि पूरे मेजबान का नाम अधिकतम 253 वर्ण (डॉट्स सहित) लंबा होना चाहिए। हालांकि यह बाधा कड़ाई से नियमित रूप से बोल रही है, लेकिन इस नियम को शामिल करने वाले रेगेक्स बनाने के लिए संभव नहीं है।

एक और विचार, विशेष रूप से इनपुट सत्यापन के लिए रेग्जेस का उपयोग करते समय, उपयोगकर्ता की प्रतिक्रिया है। यदि कोई उपयोगकर्ता किसी गलत पते पर प्रवेश करता है, तो एक साधारण "सिंटैक्टिकली गलत पते" की तुलना में थोड़ी अधिक प्रतिक्रिया देना अच्छा होगा। "वेनिला" के साथ यह संभव नहीं है।

पते पर विचार करके इन दोनों बातों पर ध्यान दिया जा सकता है। मेजबान नामों पर अतिरिक्त लंबाई की बाधा कुछ मामलों में एक अतिरिक्त रेगेक्स का उपयोग करके भी पता की जा सकती है जो इसे जांचता है, और दोनों अभिव्यक्तियों के खिलाफ पते का मिलान करता है।

इस उत्तर में कोई भी प्रतिक्षेप प्रदर्शन के लिए अनुकूलित नहीं है। यदि प्रदर्शन एक समस्या है, तो आपको यह देखना चाहिए कि क्या (और कैसे) आपकी पसंद का rexx अनुकूलित किया जा सकता है।


3
RFC 6532 अद्यतन पूर्ण और स्वच्छ UTF-8 को शामिल करने के लिए 5322 अपडेट करता है । अतिरिक्त विवरण यहाँ

विकिपीडिया के अनुसार ऐसा लगता है कि स्थानीय भाग, जब बिंदीदार होता है, तो प्रति भाग 64 वर्णों की सीमा होती है, और साथ ही RFC 5322 डॉटेड स्थानीय भाग को डोमेन के प्रतिबंधों के साथ व्याख्या करने के लिए संदर्भित करता है। उदाहरण के लिए arbitrary-long-email-address-should-be-invalid-arbitrary-long-email-address-should-be-invalid.and-the-second-group-also-should-not-be-so-long-and-the-second-group-also-should-not-be-so-long@example.comमान्य नहीं होना चाहिए। मैं पहले समूह (वैकल्पिक डॉट से पहले नाम) और दूसरे समूह (निम्नलिखित डॉट्स के बाद नाम) में "+" संकेत बदलने का सुझाव देता हूं{1,64}
Xavi मोंटेरो

जैसा कि टिप्पणियां आकार में सीमित हैं, यहां परिणामी रेगेक्स I का उपयोग करने की योजना है, जो इस उत्तर की शुरुआत में है, साथ ही स्थानीय भाग में आकार को सीमित करता है, साथ ही "/" से पहले बैक-स्लेश को जोड़ता है। PHP द्वारा आवश्यक प्रतीक के रूप में और regex101.com में भी प्रतीक: PHP में मैं उपयोग करता हूं:$emailRegex = '/^([-!#-\'*+\/-9=?A-Z^-~]{1,64}(\.[-!#-\'*+\/-9=?A-Z^-~]{1,64})*|"([]!#-[^-~ \t]|(\\[\t -~]))+")@[0-9A-Za-z]([0-9A-Za-z-]{0,61}[0-9A-Za-z])?(\.[0-9A-Za-z]([0-9A-Za-z-]{0,61}[0-9A-Za-z])?)+$/';
Xavi Montero

चेतावनी: किसी कारण से, StackOverflow प्रदान किए गए मार्काडाउन से कॉपी करते समय छिपे हुए अक्षर जोड़ता है। इसे regex101.com पर कॉपी करें और आपको वहां ब्लैक डॉट्स दिखाई देंगे। आपको उन्हें निकालना होगा और स्ट्रिंग को सही करना होगा ... हो सकता है कि यदि उत्तर में एकीकृत किया गया हो, तो वे सही ढंग से मैत्रीपूर्ण हैं। असुविधा के लिए खेद है। मैं एक नया उत्तर नहीं जोड़ना चाहता क्योंकि यह एक उचित है। इसके अलावा, मैं सीधे संपादित नहीं करना चाहता जब तक कि समुदाय को यह नहीं लगता कि इसे एकीकृत किया जाना चाहिए।
ज़ावी मोंटेरो

@ XaviMontero Xavi के योगदान के लिए थाक्स! क्या आपके पास स्थानीय भाग लेबल पर 64 वर्ण सीमा बताते हुए RFC का संदर्भ है? यदि हां, तो मैं खुशी से उत्तर को समायोजित करूंगा।
रिंकी

73

नेट पर इसके बहुत सारे उदाहरण हैं (और मुझे लगता है कि एक भी ऐसा है जो आरएफसी को पूरी तरह से मान्य करता है - लेकिन यह दसियों / सैकड़ों लाइनें लंबी है अगर मेमोरी काम करती है)। लोग इस तरह की बात को मान्य करने से पीछे हट जाते हैं। क्यों नहीं जाँच करें कि यह एक @ और कम से कम एक है। और कुछ सरल न्यूनतम लंबाई को पूरा करता है। यह एक नकली ईमेल दर्ज करने के लिए तुच्छ है और फिर भी किसी भी वैध रेगेक्स से मेल खाता है। मुझे लगता है कि झूठी सकारात्मक गलत नकारात्मक से बेहतर हैं।


1
हां, लेकिन कौन सा आरएफसी? :) यह [RFC 32 5322-सत्यापनकर्ता] ( stackoverflow.com/questions/201323/… ) केवल चालीस लाइनों के आसपास है।
tchrist

14
ए । आवश्यक नहीं। एक TLD में ईमेल पते हो सकते हैं, या कोई IPv6 पता हो सकता है
Sijmen Mulder

1
RFC, कहानी का अंत नहीं कर रहे हैं: आईसीएएनएन 'dotless' की अनुमति नहीं है डोमेन किसी भी अधिक: icann.org/news/announcement-2013-08-30-en
सिन्क्रो

64

यह तय करते समय कि कौन से वर्णों की अनुमति है, कृपया अपने उदासीन और हायफ़न वाले मित्रों को याद रखें। मेरा इस तथ्य पर कोई नियंत्रण नहीं है कि मेरी कंपनी एचआर सिस्टम से मेरे नाम का उपयोग करके अपना ईमेल पता बनाती है। इसमें मेरे अंतिम नाम में धर्मोपदेश शामिल है। मैं आपको यह नहीं बता सकता कि कितनी बार मुझे इस वेबसाइट के साथ बातचीत करने से रोका गया है कि मेरा ईमेल पता "अमान्य" है।


4
यह उन कार्यक्रमों में एक सुपर आम समस्या है जो किसी व्यक्ति के नाम पर अनुमति नहीं है के बारे में अनुचित धारणाएं बनाते हैं। किसी को ऐसी कोई धारणा नहीं बनानी चाहिए, बस किसी भी चरित्र को स्वीकार करना चाहिए जो प्रासंगिक आरएफसी को कहना चाहिए।
tchrist

4
हाँ। मैं विशेष रूप से प्रोग्रामर के खिलाफ ई-मेल पतों में बड़े अक्षरों को अस्वीकार करने के लिए प्रेरित हूं! मूर्ख और / या आलसी।
फीलहो

63

यह रेगेक्स पर्ल के ईमेल :: मान्य पुस्तकालय से है। मेरा मानना ​​है कि यह सबसे सटीक है, यह सभी 822 से मेल खाता है। और, यह ओ'रेली में नियमित अभिव्यक्ति पर आधारित है:

जेफरी फ्रीडल के उदाहरण का उपयोग करके मास्टेरिंग रेगुलर एक्सप्रेशंस ( http://www.ora.com/catalog/regexp/ ) में नियमित अभिव्यक्ति का निर्माण किया गया ।

$RFC822PAT = <<'EOF';
[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\
xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xf
f\n\015()]*)*\)[\040\t]*)*(?:(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\x
ff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"[^\\\x80-\xff\n\015
"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[\040\t]*(?:\([^\\\x80-\
xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80
-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*
)*(?:\.[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\
\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\
x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x8
0-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"[^\\\x80-\xff\n
\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[\040\t]*(?:\([^\\\x
80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^
\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040
\t]*)*)*@[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([
^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\
\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\
x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-
\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()
]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\
x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\04
0\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\
n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\
015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?!
[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\
]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\
x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\01
5()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*|(?:[^(\040)<>@,;:".
\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]
)|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[^
()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037]*(?:(?:\([^\\\x80-\xff\n\0
15()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][
^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)|"[^\\\x80-\xff\
n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[^()<>@,;:".\\\[\]\
x80-\xff\000-\010\012-\037]*)*<[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?
:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-
\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:@[\040\t]*
(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015
()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()
]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\0
40)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\
[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\
xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*
)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x80
-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x
80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t
]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\
\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])
*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x
80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80
-\xff\n\015()]*)*\)[\040\t]*)*)*(?:,[\040\t]*(?:\([^\\\x80-\xff\n\015(
)]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\
\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*@[\040\t
]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\0
15()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015
()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(
\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|
\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80
-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()
]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x
80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^
\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040
\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".
\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff
])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\
\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x
80-\xff\n\015()]*)*\)[\040\t]*)*)*)*:[\040\t]*(?:\([^\\\x80-\xff\n\015
()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\
\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)?(?:[^
(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-
\037\x80-\xff])|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\
n\015"]*)*")[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|
\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))
[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x80-\xff
\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\x
ff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(
?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\
000-\037\x80-\xff])|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\
xff\n\015"]*)*")[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\x
ff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)
*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*@[\040\t]*(?:\([^\\\x80-\x
ff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-
\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)
*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\
]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\]
)[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-
\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\x
ff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(
?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80
-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<
>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x8
0-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:
\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]
*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)
*\)[\040\t]*)*)*>)
EOF

14
O_O आपको यह समझने के लिए एक रेगेक्स मास्टर होने की भी आवश्यकता होगी कि यह क्या कर रहा है
क्रिस मैकग्राथ

45

जैसा कि आप PHP में लिख रहे हैं, मैं आपको ईमेल के लिए PHP बिल्ड-इन सत्यापन का उपयोग करने की सलाह दूंगा।

filter_var($value, FILTER_VALIDATE_EMAIL)

यदि आप 5.3.6 से कम php-संस्करण चला रहे हैं, तो कृपया इस मुद्दे से अवगत रहें: https://bugs.php.net/bug.php?id=53091

यदि आप अधिक जानकारी चाहते हैं कि यह buid-in सत्यापन काम कैसे करता है, तो यहां देखें: क्या PHP का फ़िल्टर_वर FILTER_VALIDATE_EMAIL वास्तव में काम करता है?


एक वोट मिलता है, जो मैं कहने जा रहा था। IDN को हैंडल नहीं करता है, लेकिन कोड को पहले से बदलने के लिए इसे हल करता है। PHP> = 5.3 में इसके लिए idn_to_ascii () है। एक ईमेल को मान्य करने के लिए सबसे अच्छे और आसान तरीकों में से एक।
टेलर

43

कैल हेंडरसन (फ्लिकर) ने पीएचपी में पार्सिंग ईमेल एड्रेसस नामक एक लेख लिखा और दिखाया कि उचित आरएफसी (2) 822-अनुरूप ईमेल पता पार्सिंग कैसे करें। आप php , अजगर और रूबी में स्रोत कोड भी प्राप्त कर सकते हैं जो कि cc लाइसेंस प्राप्त है


इसने मुझे बताया कि a@bवैध था
dsdsdsdsd

1
@dsdsdsdsd a@bमान्य है ... इस मामले bमें शीर्ष-स्तरीय डोमेन है।
rink.attenders.6

42

मैं अपनी नियमित अभिव्यक्ति के साथ कभी भी परेशान नहीं करता, क्योंकि संभावना है कि कोई और पहले से ही एक बेहतर संस्करण के साथ आया है। मैं हमेशा अपनी पसंद का एक खोजने के लिए regexlib का उपयोग करता हूं।


1
यह लंबाई और सामग्री के लिए चिह्नित किया गया था, लेकिन यह अभी भी 41 वोटों के साथ एक अच्छा योगदान है और इसे हटाया नहीं जाना चाहिए।
विल

37

ऐसा कोई नहीं है जो वास्तव में प्रयोग करने योग्य हो।
मैं अपने जवाब में कुछ मुद्दों पर चर्चा करता हूं क्या ईमेल पते के सत्यापन के लिए php पुस्तकालय है? , इसमें भी चर्चा की गई है Regexp ईमेल पते की पहचान में मुश्किल ?

संक्षेप में, उचित कार्य करने के लिए एकल, प्रयोग करने योग्य रेगेक्स की अपेक्षा न करें। और सबसे अच्छा रेगेक्स सिंटैक्स को मान्य करेगा, न कि ई-मेल की वैधता (jhohn@example.com सही है लेकिन यह शायद उछाल देगा ...)।


गलत होने पर मुझे सही करें, लेकिन मेरा मानना ​​है कि PHP PCRE पैटर्न का उपयोग करता है। यदि हां, तो आपको एबिगेल के RFC 5322 पैटर्न के समान कुछ बनाने में सक्षम होना चाहिए ।
tchrist

@tchrist: सुनिश्चित नहीं है कि अगर PCRE ने इस सिंटैक्स को पकड़ा है (जो मुझे पता है)। यदि हां, तो निश्चित नहीं है कि अगर PHP के PCRE ने PCRE के इस संस्करण को पकड़ लिया है ... ठीक है, अगर मैं इस वाक्यविन्यास को सही ढंग से समझता हूं, तो आप वैसे भी एक regex की तुलना में बहुत स्पष्ट और पूर्ण PEG पार्सर का उपयोग कर सकते हैं।
फिलाहो

PCRE ने इसे पकड़ लिया है, लेकिन शायद PHP ने PCRE को नहीं पकड़ा है। ☹
tchrist

36

एक साधारण नियमित अभिव्यक्ति, जो कम से कम किसी भी मान्य ईमेल पते को अस्वीकार नहीं करेगी, वह किसी चीज़ की जाँच कर रही होगी, उसके बाद एक @ चिह्न और फिर कुछ अवधि और उसके बाद कम से कम 2 दिन। यह कुछ भी अस्वीकार नहीं करेगा, लेकिन कल्पना की समीक्षा के बाद मुझे ऐसा कोई ईमेल नहीं मिलेगा जो मान्य और अस्वीकृत हो।

ईमेल = ~ /.+@[^@]+\.[^@]{2,}$/


3
यह वही है जिसे मैं देख रहा था। बहुत प्रतिबंधात्मक नहीं है, लेकिन यह सुनिश्चित करता है कि केवल 1 @ है (जैसा कि हम एक सूची को पार्स कर रहे हैं और यह सुनिश्चित करना चाहते हैं कि कोई अनुपस्थित कमेंट न हो)। FYI करें, आपके पास बाईं तरफ एक @ हो सकता है यदि यह उद्धरण में है: Valid_email_addresses , लेकिन यह बहुत ही फ्रिंज है।
जोश

2
इसका उपयोग करने के बाद, यह महसूस हुआ कि यह बिल्कुल काम नहीं करता है। /^[^@]+@[^@]+\.[^@]{2}[^@]*$/ वास्तव में 1 @ चिह्न के लिए जाँच करता है। आपका regex अंत में * के कारण कई को जाने देगा।
जोश

1
सही। मैं सभी अमान्य को अस्वीकार करने का प्रयास नहीं कर रहा, बस एक मान्य ईमेल पते को अस्वीकार करने से रहा।
स्पिग करें

1
इसका उपयोग करना कहीं बेहतर होगा: /^[^@]+@[^@]+\.[^@]{2,4}$/यह सुनिश्चित करना कि यह 2 से 4 गैर @ वर्णों के साथ समाप्त होता है। @ जोश ने बताया कि अब यह अंत में एक अतिरिक्त @ की अनुमति देता है। लेकिन आप इसे और भी बदल सकते हैं: /^[^@]+@[^@]+\.[^a-z-A-Z]{2,4}$/चूंकि सभी शीर्ष स्तर डोमेन एज़ अक्षर हैं। आप भविष्य में भी शीर्ष स्तर के डोमेन नामों के 4साथ 5या अधिक अनुमति दे सकते हैं ।
FLY

@FLY, का @ फू। सही करता है। क्या यह मानकों द्वारा माना जाता है?
सेक्सीबीस्ट

29

आप jQuery सत्यापन प्लगइन द्वारा नियोजित एक का उपयोग कर सकते हैं:

/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i

यह एक अच्छा काम कर रहा है। इसने अनुमति दी: a-b'c_d.e@f-g.hलेकिन अनुचित विविधताओं को पकड़ने में सक्षम था, जैसे कि a-b'c_d.@f-g.hऔरa-b'c_d.e@f-.h
dsdsdsdsd

25

ईमेल पते को मान्य करने के लिए सबसे अच्छी नियमित अभिव्यक्ति के सबसे व्यापक मूल्यांकन के लिए कृपया इस लिंक को देखें; " ई-मेल पते की तुलना नियमित अभिव्यक्तियों को मान्य करना "

यहाँ संदर्भ उद्देश्यों के लिए वर्तमान शीर्ष अभिव्यक्ति है:

/^([\w\!\#$\%\&\'\*\+\-\/\=\?\^\`{\|\}\~]+\.)*[\w\!\#$\%\&\'\*\+\-\/\=\?\^\`{\|\}\~]+@((((([a-z0-9]{1}[a-z0-9\-]{0,62}[a-z0-9]{1})|[a-z])\.)+[a-z]{2,6})|(\d{1,3}\.){3}\d{1,3}(\:\d{1,5})?)$/i

spoon16: यह लिंक वास्तव में सही नहीं है। इसका कथन है कि ईमेल पतों को मान्य करने के लिए कोई सही पैटर्न नहीं हो सकता है। आप कर सकते हैं , लेकिन आपको यह सुनिश्चित करना होगा कि आप पत्र के ठीक नीचे आरएफसी का पालन करें। और आपको सही RFC भी चुनना होगा।
tchrist

"सबसे अच्छा" अभी जावा रीगेक्स के साथ काम नहीं करता है - यहां तक ​​कि ठीक से भागने और स्ट्रिंग को परिवर्तित करने के बाद भी।
एरिक चेन

23

निकट भविष्य में गैर-लैटिन (चीनी, अरबी, ग्रीक, हिब्रू, सिरिलिक और इतने) डोमेन नाम की अनुमति नहीं है । सभी को उपयोग किए गए ईमेल रेगेक्स को बदलना होगा, क्योंकि उन पात्रों को निश्चित रूप से न तो कवर किया जाना है [a-z]/iऔर न ही \w। वे सब विफल हो जाएंगे।

आखिरकार, ईमेल पते को मान्य करने का सबसे अच्छा तरीका वास्तव में पते को मान्य करने के लिए प्रश्न में पते पर एक ईमेल भेजना है । यदि ईमेल पता उपयोगकर्ता प्रमाणीकरण (रजिस्टर / लॉगिन / आदि) का हिस्सा है, तो आप इसे उपयोगकर्ता सक्रियण प्रणाली के साथ पूरी तरह से जोड़ सकते हैं। यानी एक निर्दिष्ट ईमेल पते के लिए एक अद्वितीय सक्रियकरण कुंजी के साथ एक लिंक के साथ एक ईमेल भेजें और केवल लॉगिन की अनुमति दें जब उपयोगकर्ता ने ईमेल में लिंक का उपयोग करके नए बनाए गए खाते को सक्रिय किया हो।

यदि रेगेक्स का उद्देश्य यूआई में उपयोगकर्ता को जल्दी से सूचित करना है कि निर्दिष्ट ईमेल पता सही प्रारूप में नहीं दिखता है, तो सबसे अच्छा यह जांचना है कि क्या यह मूल रूप से निम्न रेगेक्स से मेल खाता है:

^([^.@]+)(\.[^.@]+)*@([^.@]+\.)+([^.@]+)$

इतना ही आसान। पृथ्वी पर आप नाम और डोमेन में इस्तेमाल होने वाले पात्रों की परवाह क्यों करेंगे? यह ग्राहक की जिम्मेदारी है कि वह वैध ईमेल पता दर्ज करे, न कि सर्वर का। यहां तक ​​कि जब ग्राहक एक तरह से वैध रूप से मान्य ईमेल पता दर्ज aa@bb.ccकरता है, तो यह गारंटी नहीं देता है कि यह एक वैध ईमेल पता है। कोई भी रेगेक्स कवर नहीं कर सकता है।


4
मैं मानता हूं कि इस तरह के सामान के लिए आमतौर पर एक प्रमाणीकरण संदेश सबसे अच्छा तरीका है, वाक्यविन्यास सही है और मान्य समान नहीं हैं। जब मैं अपना ईमेल पता दो बार "कन्फर्मेशन" के लिए टाइप करने के लिए तैयार हो जाता हूं तो निराश हो जाता हूं, जैसे कि मैंने जो टाइप किया है उसे देख नहीं सकता। मैं केवल पहले एक को दूसरे में कॉपी करता हूं, ऐसा लगता है कि यह अधिक से अधिक इस्तेमाल किया जा रहा है।
पीट

इस बात से सहमत! लेकिन यह रेगेक्स मुझे नहीं लगता कि यह मान्य है क्योंकि यह ईजी के spacesबाद अनुमति देता है @.test@test.ca com netउपरोक्त रेगेक्स का उपयोग करके एक वैध ईमेल पर विचार करें जहां इसे अमान्य लौटाया जाना चाहिए।
CB4

20

एचटीएमएल 5 कल्पना का सुझाव ई-मेल पते को मान्य के लिए एक सरल regex:

/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/

यह जानबूझकर RFC 5322 का अनुपालन नहीं करता है ।

नोट: यह आवश्यकता RFC 5322 का एक विलक्षण उल्लंघन है , जो ई-मेल पते के लिए एक वाक्यविन्यास को परिभाषित करता है जो एक साथ बहुत सख्त है ( चरित्र से पहले ), बहुत अस्पष्ट ( चरित्र के बाद ), और बहुत ढीला (टिप्पणियों, व्हाट्सएप वर्णों की अनुमति देता है) और सबसे अधिक उपयोगकर्ताओं के लिए अपरिचित लोगों में उद्धृत तार) यहां व्यावहारिक उपयोग के लिए।@@

कुल लंबाई 254 वर्ण, प्रति RFC 3696 इरेटा 1690 तक सीमित हो सकती है ।


सबसे बढ़िया उत्तर! यहाँ w3 अनुशंसा के लिए एक लिंक दिया गया है: w3.org/TR/html5/forms.html#valid-e-mail-address इस regex को कई ब्राउज़रों द्वारा अपनाया गया है।
रयान टेलर

3
यह सबसे अच्छा जवाब नहीं है! यह पैटर्न इस पूरी तरह से अमान्य पते से मेल खाता है invalid@emailaddress:। इससे पहले कि आप इसका उपयोग करें, मैं सावधानी और बहुत परीक्षण करूंगा!
शेरिडन

@ श्रीधरन, अगर आपको लगता है कि HTML5 युक्ति के साथ कोई समस्या है तो आप यहाँ एक मुद्दा उठा सकते हैं: github.com/w3c/html/issues
लूना

यह बहुत अधिक नहीं जोड़ता है stackoverflow.com/a/8829363 और IMHO का कोई संपादन या उस पर टिप्पणी के रूप में बेहतर होगा।

उदाहरण @ localhost मान्य है, लेकिन एक वास्तविक विश्व अनुप्रयोग के लिए आप एक डोमेन एक्सटेंशन लागू करना चाहते हैं, आपको इसे प्राप्त करने के लिए अंतिम * को बदलकर a + करना होगा + (पैटर्न के उस हिस्से को 0+ से 1+ में बदलना) )
मिच साचवेल

15

एक ज्वलंत प्रदर्शन के लिए, निम्नलिखित राक्षस बहुत अच्छा है, लेकिन फिर भी सभी वाक्यात्मक रूप से मान्य ईमेल पतों को सही ढंग से नहीं पहचानता है: यह चार स्तरों तक गहरी नेस्टेड टिप्पणियों को पहचानता है।

यह एक पार्सर के लिए एक नौकरी है, लेकिन भले ही कोई पता वाक्यगत रूप से मान्य हो, फिर भी यह वितरण योग्य नहीं हो सकता है। कभी-कभी आपको "अरे, येल, वॉच ई-यू!" की पहाड़ी पद्धति का सहारा लेना पड़ता है।

// derivative of work with the following copyright and license:
// Copyright (c) 2004 Casey West.  All rights reserved.
// This module is free software; you can redistribute it and/or
// modify it under the same terms as Perl itself.

// see http://search.cpan.org/~cwest/Email-Address-1.80/

private static string gibberish = @"
(?-xism:(?:(?-xism:(?-xism:(?-xism:(?-xism:(?-xism:(?-xism:\
s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^
\x0A\x0D]))|(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))
|(?-xism:\\(?-xism:[^\x0A\x0D]))|)+)*\s*\)\s*))+)*\s*\)\s*)+
|\s+)*[^\x00-\x1F\x7F()<>\[\]:;@\,.<DQ>\s]+(?-xism:(?-xism:\
s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^
\x0A\x0D]))|(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))
|(?-xism:\\(?-xism:[^\x0A\x0D]))|)+)*\s*\)\s*))+)*\s*\)\s*)+
|\s+)*)|(?-xism:(?-xism:(?-xism:\s*\((?:\s*(?-xism:(?-xism:(
?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|(?-xism:\s*\((?
:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x
0D]))|)+)*\s*\)\s*))+)*\s*\)\s*)+|\s+)*<DQ>(?-xism:(?-xism:[
^\\<DQ>])|(?-xism:\\(?-xism:[^\x0A\x0D])))+<DQ>(?-xism:(?-xi
sm:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xis
m:[^\x0A\x0D]))|(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\
]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|)+)*\s*\)\s*))+)*\s*\)\
s*)+|\s+)*))+)?(?-xism:(?-xism:(?-xism:\s*\((?:\s*(?-xism:(?
-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|(?-xism:
\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[
^\x0A\x0D]))|)+)*\s*\)\s*))+)*\s*\)\s*)+|\s+)*<(?-xism:(?-xi
sm:(?-xism:(?-xism:(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^(
)\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|(?-xism:\s*\((?:\s*(
?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))
|)+)*\s*\)\s*))+)*\s*\)\s*)+|\s+)*(?-xism:[^\x00-\x1F\x7F()<
>\[\]:;@\,.<DQ>\s]+(?:\.[^\x00-\x1F\x7F()<>\[\]:;@\,.<DQ>\s]
+)*)(?-xism:(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))
|(?-xism:\\(?-xism:[^\x0A\x0D]))|(?-xism:\s*\((?:\s*(?-xism:
(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|)+)*\s
*\)\s*))+)*\s*\)\s*)+|\s+)*)|(?-xism:(?-xism:(?-xism:\s*\((?
:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x
0D]))|(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xi
sm:\\(?-xism:[^\x0A\x0D]))|)+)*\s*\)\s*))+)*\s*\)\s*)+|\s+)*
<DQ>(?-xism:(?-xism:[^\\<DQ>])|(?-xism:\\(?-xism:[^\x0A\x0D]
)))+<DQ>(?-xism:(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\
]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|(?-xism:\s*\((?:\s*(?-x
ism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|)+
)*\s*\)\s*))+)*\s*\)\s*)+|\s+)*))\@(?-xism:(?-xism:(?-xism:(
?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?
-xism:[^\x0A\x0D]))|(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^
()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|)+)*\s*\)\s*))+)*\s
*\)\s*)+|\s+)*(?-xism:[^\x00-\x1F\x7F()<>\[\]:;@\,.<DQ>\s]+(
?:\.[^\x00-\x1F\x7F()<>\[\]:;@\,.<DQ>\s]+)*)(?-xism:(?-xism:
\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[
^\x0A\x0D]))|(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+)
)|(?-xism:\\(?-xism:[^\x0A\x0D]))|)+)*\s*\)\s*))+)*\s*\)\s*)
+|\s+)*)|(?-xism:(?-xism:(?-xism:\s*\((?:\s*(?-xism:(?-xism:
(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|(?-xism:\s*\((
?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\
x0D]))|)+)*\s*\)\s*))+)*\s*\)\s*)+|\s+)*\[(?:\s*(?-xism:(?-x
ism:[^\[\]\\])|(?-xism:\\(?-xism:[^\x0A\x0D])))+)*\s*\](?-xi
sm:(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:
\\(?-xism:[^\x0A\x0D]))|(?-xism:\s*\((?:\s*(?-xism:(?-xism:(
?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|)+)*\s*\)\s*))+
)*\s*\)\s*)+|\s+)*)))>(?-xism:(?-xism:\s*\((?:\s*(?-xism:(?-
xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|(?-xism:\
s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^
\x0A\x0D]))|)+)*\s*\)\s*))+)*\s*\)\s*)+|\s+)*))|(?-xism:(?-x
ism:(?-xism:(?-xism:(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^
()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|(?-xism:\s*\((?:\s*
(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D])
)|)+)*\s*\)\s*))+)*\s*\)\s*)+|\s+)*(?-xism:[^\x00-\x1F\x7F()
<>\[\]:;@\,.<DQ>\s]+(?:\.[^\x00-\x1F\x7F()<>\[\]:;@\,.<DQ>\s
]+)*)(?-xism:(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+)
)|(?-xism:\\(?-xism:[^\x0A\x0D]))|(?-xism:\s*\((?:\s*(?-xism
:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|)+)*\
s*\)\s*))+)*\s*\)\s*)+|\s+)*)|(?-xism:(?-xism:(?-xism:\s*\((
?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\
x0D]))|(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-x
ism:\\(?-xism:[^\x0A\x0D]))|)+)*\s*\)\s*))+)*\s*\)\s*)+|\s+)
*<DQ>(?-xism:(?-xism:[^\\<DQ>])|(?-xism:\\(?-xism:[^\x0A\x0D
])))+<DQ>(?-xism:(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\
\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|(?-xism:\s*\((?:\s*(?-
xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|)
+)*\s*\)\s*))+)*\s*\)\s*)+|\s+)*))\@(?-xism:(?-xism:(?-xism:
(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(
?-xism:[^\x0A\x0D]))|(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[
^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|)+)*\s*\)\s*))+)*\
s*\)\s*)+|\s+)*(?-xism:[^\x00-\x1F\x7F()<>\[\]:;@\,.<DQ>\s]+
(?:\.[^\x00-\x1F\x7F()<>\[\]:;@\,.<DQ>\s]+)*)(?-xism:(?-xism
:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:
[^\x0A\x0D]))|(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+
))|(?-xism:\\(?-xism:[^\x0A\x0D]))|)+)*\s*\)\s*))+)*\s*\)\s*
)+|\s+)*)|(?-xism:(?-xism:(?-xism:\s*\((?:\s*(?-xism:(?-xism
:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|(?-xism:\s*\(
(?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A
\x0D]))|)+)*\s*\)\s*))+)*\s*\)\s*)+|\s+)*\[(?:\s*(?-xism:(?-
xism:[^\[\]\\])|(?-xism:\\(?-xism:[^\x0A\x0D])))+)*\s*\](?-x
ism:(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism
:\\(?-xism:[^\x0A\x0D]))|(?-xism:\s*\((?:\s*(?-xism:(?-xism:
(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|)+)*\s*\)\s*))
+)*\s*\)\s*)+|\s+)*))))(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?
>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|(?-xism:\s*\((?:
\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0
D]))|)+)*\s*\)\s*))+)*\s*\)\s*)*)"
  .Replace("<DQ>", "\"")
  .Replace("\t", "")
  .Replace(" ", "")
  .Replace("\r", "")
  .Replace("\n", "");

private static Regex mailbox =
  new Regex(gibberish, RegexOptions.ExplicitCapture); 

12

आधिकारिक मानक RFC 2822 के अनुसार वैध ईमेल regex है

(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])

यदि आप इसे जावा में उपयोग करना चाहते हैं तो यह वास्तव में बहुत आसान है

import java.util.regex.*;

class regexSample 
{
   public static void main(String args[]) 
   {
      //Input the string for validation
      String email = "xyz@hotmail.com";

      //Set the email pattern string
      Pattern p = Pattern.compile(" (?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"
              +"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")"
                     + "@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\]");

      //Match the given string with the pattern
      Matcher m = p.matcher(email);

      //check whether match is found 
      boolean matchFound = m.matches();

      if (matchFound)
        System.out.println("Valid Email Id.");
      else
        System.out.println("Invalid Email Id.");
   }
}

1
आपके रेगेक्स में लियोनार्डो.davinci@gmail.com उदाहरण के लिए पहला अपरकेस अक्षर शामिल नहीं है जो कुछ उपयोगकर्ताओं के लिए कष्टप्रद हो सकता है। इसके बजाय इसका प्रयोग करें:(?:[A-Za-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[A-Za-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])
कबाब क्रैब

@KababKrabby धन्यवाद, कृपया जवाब संपादित करें, मैं बदलाव को स्वीकार करूंगा।
अजे_

अगर मैं आपके जवाब में उस बदलाव को जोड़ दूं तो यह RFC 2822 हो सकता है इसलिए मुझे नहीं पता कि क्या यह सही है।
कबाब क्राबी

11

यहाँ PHP मैं उपयोग है। मैंने इस समाधान को "गलत सकारात्मकता की तुलना में झूठे नकारात्मक से बेहतर है" के रूप में चुना है, जैसा कि एक अन्य टिप्पणीकार ने यहां घोषित किया है और आपके प्रतिक्रिया समय और सर्वर लोड को कम रखने के संबंध में ... वास्तव में सर्वर संसाधनों को बर्बाद करने की कोई आवश्यकता नहीं है एक नियमित अभिव्यक्ति जब यह सबसे सरल उपयोगकर्ता त्रुटि को समाप्त कर देगा। यदि आप चाहें तो आप परीक्षण ईमेल भेजकर हमेशा इसका पालन कर सकते हैं।

function validateEmail($email) {
  return (bool) stripos($email,'@');
}

1
क) "अपशिष्ट सर्वर संसाधन" असीम है, लेकिन अगर आप इतने इच्छुक हैं, तो आप इसे ग्राहक पक्ष जेएस बी के साथ कर सकते हैं) आपको पंजीकरण मेल भेजने की क्या आवश्यकता है और उपयोगकर्ता मुझे @ forgotthedotcom में प्रवेश करता है? आपका "समाधान" विफल हो जाता है और आप एक उपयोगकर्ता खो देते हैं।
जॉन्जोन

क) एक जेएस मान्यता पर भरोसा करना जब जावास्क्रिप्ट अक्षम हो जाता है, तो यह सबसे अच्छा विचार भी नहीं लगता है (बस btw)
auco

11

RFC 5322 मानक:

Dot-atom स्थानीय-भाग, उद्धृत-स्ट्रिंग स्थानीय-भाग, अप्रचलित (मिश्रित dot-atom और quoted-string) स्थानीय-भाग, डोमेन नाम डोमेन, (IPv4, IPv6 और IPv4- मैप किए गए IPv4 पता) डोमेन शाब्दिक डोमेन की अनुमति देता है और (नेस्टेड) ​​CFWS।

'/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD'

RFC 5321 मानक:

डॉट-एटम स्थानीय-भाग, उद्धृत-स्ट्रिंग स्थानीय-भाग, डोमेन नाम डोमेन, और (IPv4, IPv6, और IPv4-mapped IPv6 पता) डोमेन शाब्दिक डोमेन की अनुमति देता है।

'/^(?!(?>"?(?>\\\[ -~]|[^"])"?){255,})(?!"?(?>\\\[ -~]|[^"]){65,}"?@)(?>([!#-\'*+\/-9=?^-~-]+)(?>\.(?1))*|"(?>[ !#-\[\]-~]|\\\[ -~])*")@(?!.*[^.]{64,})(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\.(?2)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?3)){7}|(?!(?:.*[a-f0-9][:\]]){8,})((?3)(?>:(?3)){0,6})?::(?4)?))|(?>(?>IPv6:(?>(?3)(?>:(?3)){5}:|(?!(?:.*[a-f0-9]:){6,})(?5)?::(?>((?3)(?>:(?3)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(?>\.(?6)){3}))\])$/iD'

बेसिक:

डॉट-एटम लोकल-पार्ट और डोमेन नेम डोमेन की अनुमति देता है (टीएलडी के साथ कम से कम दो डोमेन नाम लेबल की आवश्यकता होती है जो 2-6 अल्फाबेटिक वर्णों तक सीमित है)।

"/^(?!.{255,})(?!.{65,}@)([!#-'*+\/-9=?^-~-]+)(?>\.(?1))*@(?!.*[^.]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?\.){1,126}[a-z]{2,6}$/iD"

शैतान भाषा क्या है ?? मुझे एक /Dझंडा दिखाई देता है , और आपने इसे एकल उद्धरण के साथ उद्धृत किया है, फिर भी पैटर्न को परिसीमित करने के लिए स्लैश का उपयोग किया है? यह पर्ल नहीं है, और यह पीसीआरई नहीं हो सकता है। क्या यह PHP है? मेरा मानना ​​है कि वे केवल तीन हैं जो पुनरावृत्ति की अनुमति देते हैं (?1)
tchrist

यह PHP में है, जो PCRE का उपयोग करता है। स्लैश का उपयोग केवल कोष्ठक, वर्ग कोष्ठक और निश्चित रूप से स्लैश और एकल उद्धरण जैसे विशेष वर्णों को परिसीमित करने के लिए किया जाता है। / D ध्वज, यदि आप नहीं जानते, तो स्ट्रिंग के अंत में जोड़ी जा रही एक नई रेखा को रोकना है, जिसे अन्यथा अनुमति दी जाएगी।
माइकलरटन

9

अजीब बात है कि आप 4 वर्ण TLD को "अनुमति नहीं" दे सकते हैं। आप .info और .name , और लंबाई सीमा को रोकने के लिए लोगों पर प्रतिबंध लगा रहे हैं andvel और .museum , लेकिन हाँ, वे 2 वर्ण TLD और 3 वर्ण TLD से कम सामान्य हैं।

आपको अपरकेस अल्फाबेट की भी अनुमति देनी चाहिए। ईमेल सिस्टम स्थानीय भाग और डोमेन भाग को सामान्य करेगा।

डोमेन भाग के अपने regex के लिए, डोमेन नाम '-' से शुरू नहीं हो सकता है और '-' के साथ समाप्त नहीं हो सकता है। डैश केवल बीच में रह सकता है।

यदि आपने PEAR लाइब्रेरी का उपयोग किया है, तो उनके मेल फ़ंक्शन की जाँच करें (सटीक नाम / लाइब्रेरी भूल गए)। आप एक फ़ंक्शन को कॉल करके ईमेल पते को मान्य कर सकते हैं, और यह RFC822 में परिभाषा के अनुसार ईमेल पते को मान्य करता है।


2
@ जोसेफ यी: आरएफसी 822 थोड़ा सा दिनांकित नहीं है?
tchrist

8
public bool ValidateEmail(string sEmail)
{
    if (sEmail == null)
    {
        return false;
    }

    int nFirstAT = sEmail.IndexOf('@');
    int nLastAT = sEmail.LastIndexOf('@');

    if ((nFirstAT > 0) && (nLastAT == nFirstAT) && (nFirstAT < (sEmail.Length - 1)))
    {
        return (Regex.IsMatch(sEmail, @"^[a-z|0-9|A-Z]*([_][a-z|0-9|A-Z]+)*([.][a-z|0-9|A-Z]+)*([.][a-z|0-9|A-Z]+)*(([_][a-z|0-9|A-Z]+)*)?@[a-z][a-z|0-9|A-Z]*\.([a-z][a-z|0-9|A-Z]*(\.[a-z][a-z|0-9|A-Z]*)?)$"));
    }
    else
    {
        return false;
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.