দ্রুত উত্তর
ইনপুট বৈধতার জন্য নিম্নলিখিত রেজেেক্স ব্যবহার করুন:
([-!#-'*+/-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])?)+
এই রেজেক্সের সাথে মিলিত ঠিকানাগুলি:
- আরএফসি 5321/5322 এর সাথে কঠোরভাবে মেনে চলে এমন একটি স্থানীয় অংশ (যেমন @-সাইন এর আগে অংশ) রয়েছে,
- একটি ডোমেন অংশ রয়েছে (যেমন @ -Sign এর পরে অংশ) যা কমপক্ষে দুটি লেবেল সহ একটি হোস্টের নাম, যার প্রতিটিই সর্বাধিক characters৩ টি অক্ষর দীর্ঘ।
দ্বিতীয় সীমাবদ্ধতা আরএফসি 5321/5322 এ একটি বিধিনিষেধ।
বিস্তারিত উত্তর
ইমেল ঠিকানাগুলি সনাক্ত করে এমন একটি নিয়মিত অভিব্যক্তি ব্যবহার করা বিভিন্ন পরিস্থিতিতে কার্যকর হতে পারে: উদাহরণস্বরূপ কোনও নথিতে ইমেল ঠিকানাগুলির জন্য স্ক্যান করা, ব্যবহারকারীর ইনপুটকে বৈধতা দিতে বা কোনও ডেটা সংগ্রহস্থলে অখণ্ডতার সীমাবদ্ধতা হিসাবে।
তবে এটি লক্ষ করা উচিত যে আপনি যদি ঠিকানাটি একটি বিদ্যমান মেলবক্সকে প্রকৃতপক্ষে উল্লেখ করে কিনা তা জানতে চাইলে ঠিকানায় কোনও বার্তা প্রেরণের বিকল্প নেই। যদি আপনি কেবল কোনও ঠিকানাটি ব্যাকরণগতভাবে সঠিক কিনা তা পরীক্ষা করতে চান তবে আপনি একটি নিয়মিত অভিব্যক্তি ব্যবহার করতে পারেন, তবে এটি নোট করুন""@[]
ব্যাকরণগতভাবে সঠিক ইমেল ঠিকানা যা অবশ্যই কোনও বিদ্যমান মেলবক্সকে উল্লেখ করে না।
ইমেল ঠিকানাগুলির বাক্য গঠনটি বিভিন্ন আরএফসিগুলিতে সংজ্ঞায়িত করা হয়েছে , উল্লেখযোগ্যভাবে আরএফসি 822 এবং আরএফসি 5322 । আরএফসি 822 কে "আসল" স্ট্যান্ডার্ড হিসাবে এবং আরএফসি 5322 কে সর্বশেষ মান হিসাবে দেখা উচিত। আরএফসি 822 এ সংজ্ঞায়িত সিনট্যাক্সটি সবচেয়ে লেনিয়েন্ট এবং পরবর্তী মানগুলি সিনট্যাক্সটিকে আরও এবং আরও সীমিত করেছে, যেখানে নতুন সিস্টেম বা পরিষেবাগুলি অপ্রচলিত সিনট্যাক্সকে স্বীকৃতি দিতে পারে, তবে কখনই এটি উত্পাদন করে না।
এই উত্তরে আমি "ইমেল ঠিকানা" নেব যার অর্থ addr-spec
আরএফসিগুলিতে সংজ্ঞায়িত হয়েছে (যেমন jdoe@example.org
, তবে নয় "John Doe"<jdoe@example.org>
, নাও)some-group:jdoe@example.org,mrx@exampel.org;
)।
আরএফসি সিনট্যাক্সগুলি রেজেক্সে অনুবাদ করার ক্ষেত্রে একটি সমস্যা আছে: সিনট্যাক্সগুলি নিয়মিত নয়! এটি কারণ তারা ইমেল ঠিকানাগুলিতে alচ্ছিক মন্তব্যের জন্য মঞ্জুরি দেয় যা অসীমভাবে বাসা বেঁধে দেওয়া যেতে পারে, অন্যদিকে নিয়মিত প্রকাশের মাধ্যমে অসীম বাসা বেঁধে দেওয়া যায় না। মন্তব্যযুক্ত ঠিকানাগুলির জন্য স্ক্যান করতে বা যাচাই করতে আপনার একটি পার্সার বা আরও শক্তিশালী এক্সপ্রেশন দরকার। (নোট করুন যে পার্লের মতো ভাষাগুলি প্রসঙ্গমুক্ত ব্যাকরণগুলিকে একটি রেজেক্সের মতো উপায়ে বর্ণনা করার জন্য কনস্ট্রাক্টস রয়েছে।) এই উত্তরে আমি মন্তব্যগুলিকে উপেক্ষা করব এবং কেবল সঠিক নিয়মিত অভিব্যক্তি বিবেচনা করব।
আরএফসিগুলি ইমেল বার্তাগুলির জন্য সিনট্যাক্সগুলি সংজ্ঞায়িত করে, যেমন ইমেল ঠিকানাগুলির জন্য নয়। ঠিকানাগুলি বিভিন্ন শিরোনাম ক্ষেত্রগুলিতে উপস্থিত হতে পারে এবং এখান থেকেই সেগুলি প্রাথমিকভাবে সংজ্ঞায়িত করা হয়। যখন তারা শিরোনাম ক্ষেত্রগুলিতে উপস্থিত হয় ঠিকানাগুলিতে (লেজিকাল টোকেনগুলির মধ্যে) সাদা স্থান, মন্তব্য এবং লাইনব্র্যাক থাকতে পারে। শব্দার্থগতভাবে যদিও এর কোনও তাত্পর্য নেই। কোনও ঠিকানা থেকে এই সাদা স্থান ইত্যাদি সরিয়ে আপনি শব্দার্থগত সমতুল্য ক্যানোনিকাল উপস্থাপনা পাবেন । সুতরাং, এর আধ্যাত্মিক উপস্থাপনা first. last (comment) @ [3.5.7.9]
হয় first.last@[3.5.7.9]
।
বিভিন্ন উদ্দেশ্যে বিভিন্ন সিনট্যাক্স ব্যবহার করা উচিত। আপনি যদি কোনও (সম্ভবত খুব পুরানো) নথিতে ইমেল ঠিকানাগুলির জন্য স্ক্যান করতে চান তবে আরএফসি 822-এ বর্ণিত সংশ্লেষটি ব্যবহার করা ভাল ধারণা হতে পারে the অন্যদিকে, আপনি যদি ব্যবহারকারী ইনপুটকে বৈধ করতে চান তবে আপনি এটি ব্যবহার করতে পারেন আরএফসি 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 সহ complient এর ত্রুটি-বিচ্যুতি । এটি কেবলমাত্র ইমেল ঠিকানাগুলি তাদের প্রমিত আকারে স্বীকৃতি দেয়। সাদা অংশকে (ভাঁজ করা) স্বীকৃতিপ্রাপ্ত একটি রেগেক্সের জন্য নীচের উপকরণটি দেখুন।
অনুভূতিটি দেখায় যে আমি কীভাবে অভিব্যক্তিটিতে পৌঁছেছি। আমি আরএফসি থেকে সমস্ত প্রাসঙ্গিক ব্যাকরণের নিয়মগুলি ঠিক যেমন প্রদর্শিত হয় তার তালিকাভুক্ত করি, তারপরে সংশ্লিষ্ট রেজেক্স। যেখানে একটি ত্রুটি প্রকাশিত হয়েছে আমি সংশোধন ব্যাকরণ নিয়মের জন্য পৃথক অভিব্যক্তি দিই ("ইররাটাম চিহ্নিত") এবং পরবর্তী নিয়মিত অভিব্যক্তিগুলিতে একটি আপডেট এক্সপ্রেশন হিসাবে আপডেট হওয়া সংস্করণটি ব্যবহার করি।
অনুচ্ছেদ ৩.১.৪ তে বর্ণিত হয়েছে। আরএফসি 822 এর alচ্ছিক রৈখিক সাদা স্থান লেক্সিকাল টোকেনগুলির মধ্যে সন্নিবেশ করা যেতে পারে। প্রযোজ্য যেখানে আমি এই নিয়মটি মানিয়ে নিতে এক্সপ্রেশনগুলি প্রসারিত করেছি এবং ফলাফলটিকে "opt-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)*]))*
আরএফসি 5322
আমি নিম্নলিখিত নিয়মিত প্রকাশে পৌঁছেছি। আমি সবাইকে এটি চেষ্টা করে বিরতি দেওয়ার জন্য আমন্ত্রণ জানাচ্ছি। আপনি যদি কোনও মিথ্যা ধনাত্মক বা মিথ্যা নেতিবাচক সন্ধান পান তবে দয়া করে তাদের একটি মন্তব্যে পোস্ট করুন এবং আমি যত তাড়াতাড়ি সম্ভব ভাবটি ঠিক করার চেষ্টা করব।
([-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*|"([]!#-[^-~ \t]|(\\[\t -~]))+")@([-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*|\[[\t -Z^-~]*])
আমি বিশ্বাস করি সম্পূর্ণরূপে জন্য RFC 5322 সহ complient এর ত্রুটি-বিচ্যুতি । এটি কেবলমাত্র ইমেল ঠিকানাগুলি তাদের প্রমিত আকারে স্বীকৃতি দেয়। সাদা অংশকে (ভাঁজ করা) স্বীকৃতিপ্রাপ্ত একটি রেগেক্সের জন্য নীচের উপকরণটি দেখুন।
অনুভূতিটি দেখায় যে আমি কীভাবে অভিব্যক্তিটিতে পৌঁছেছি। আমি আরএফসি থেকে সমস্ত প্রাসঙ্গিক ব্যাকরণের নিয়মগুলি ঠিক যেমন প্রদর্শিত হয় তার তালিকাভুক্ত করি, তারপরে সংশ্লিষ্ট রেজেক্স। নিয়মগুলির জন্য যা শব্দার্থবিজ্ঞানহীন অপ্রাসঙ্গিক (ভাঁজ) সাদা স্থান অন্তর্ভুক্ত, আমি একটি পৃথক রেইজেক্স "(সাধারণীকরণ") চিহ্নিত করি যা এই সাদা স্থানটিকে গ্রহণ করে না।
আমি আরএফসির সমস্ত "obs-" নিয়ম উপেক্ষা করেছি। এর অর্থ হ'ল রেজিেক্সগুলি কেবলমাত্র ইমেল ঠিকানার সাথে মেলে যা কঠোরভাবে আরএফসি 5322 অনুসারে হয়। আপনার যদি "পুরানো" ঠিকানাগুলি মিল করতে হয় (যেমন "obs-" বিধিগুলি সহ লুজার ব্যাকরণটি রয়েছে), আপনি পূর্ববর্তী অনুচ্ছেদ থেকে আরএফসি 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 স্থানীয় পক্ষ থেকে খুব কঠোর (অর্থাত আগে @ -sign অংশ)। এটি কারণ "..", "এ..বি" এবং "এ"। হয় না বৈধ ডট পরমাণু যখন তারা ডাকবাক্স নাম হিসাবে ব্যবহার করা যেতে পারে। জন্য RFC অবশ্য নেই এই মতো স্থানীয় অংশের জন্য অনুমতি ছাড়া যে তারা উদ্ধৃত করা থাকতে হবে। সুতরাং আপনি পরিবর্তে a..b@example.net
লিখতে হবে "a..b"@example.net
, যা শব্দার্থ সমতুল্য।
আরও বিধিনিষেধ
এসএমটিপি ( আরএফসি 5321 অনুসারে সংজ্ঞায়িত ) বৈধ ইমেল ঠিকানাগুলির সেটকে আরও সীমাবদ্ধ করে (বা আসলে: মেলবক্সের নাম)। এই কঠোর ব্যাকরণ আরোপ করা যুক্তিসঙ্গত বলে মনে হচ্ছে, যাতে মিলিত ইমেল ঠিকানাটি আসলে ইমেল প্রেরণে ব্যবহার করা যায়।
আরএফসি 5321 মূলত "লোকাল" অংশটি ছেড়ে দেয় (অর্থাত্ @-সাইন এর আগে অংশ), তবে এটি ডোমেন অংশে (অর্থাত্ @-সিগনের পরে অংশ) কঠোর। এটি কেবল ডোম-পরমাণুর জায়গায় হোস্টের নাম এবং ডোমেন আক্ষরিকের পরিবর্তে ঠিকানা আক্ষরিকের অনুমতি দেয়।
আরএফসি 5321 এ উপস্থাপিত ব্যাকরণটি খুব স্বাচ্ছন্দ্যযুক্ত যখন এটি হোস্টের নাম এবং আইপি ঠিকানার উভয় ক্ষেত্রেই আসে। আমি এই খসড়াটি এবং আরএফসি 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^-~]+)])
ব্যবহারকারীর ইনপুট বৈধতা
একটি সাধারণ ব্যবহারের ক্ষেত্রে ব্যবহারকারীর ইনপুট বৈধতা, উদাহরণস্বরূপ এইচটিএমএল ফর্ম। সেক্ষেত্রে অ্যাড্রেস-লিটারালগুলি অন্তর্ভুক্ত করা এবং হোস্টনামে কমপক্ষে দুটি লেবেল প্রয়োজন। ভিত্তি হিসাবে পূর্ববর্তী বিভাগ থেকে উন্নত আরএফসি 5321 রিজেক্স গ্রহণ করা, ফলাফল প্রকাশ হবে:
([-!#-'*+/-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
) অনুমতি দেয় ।
আমি আক্ষরিক শীর্ষ-স্তরের ডোমেনগুলির তালিকার বিরুদ্ধে এমনকি স্পষ্টভাবে বৈধতা দেওয়ার বা দৈর্ঘ্য-সীমাবদ্ধতার চাপ দেওয়ারও প্রস্তাব দিই না (মনে রাখবেন কীভাবে ".মিউসিয়াম" অবৈধ হয়েছে [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|
ইত্যাদি ...)
আপনি সুস্পষ্ট শীর্ষ স্তরের ডোমেন বৈধতার পথে নামার সিদ্ধান্ত নিলে আপনার রেজেক্সকে আপ টু ডেট রাখার বিষয়টি নিশ্চিত করুন।
আরও বিবেচনা
ডোমেন অংশে কেবলমাত্র হোস্টের নাম স্বীকার করার পরে (@-সাইন এর পরে), উপরের রেজিক্সরা কেবলমাত্র সর্বোচ্চ লেবেলগুলিকে সর্বাধিক characters৩ টি অক্ষর সহ গ্রহণ করবে। তবে, তারা এই সত্যটি প্রয়োগ করে না যে পুরো হোস্টের নামটি অবশ্যই সর্বাধিক 253 অক্ষর দীর্ঘ হতে হবে (বিন্দু সহ)। যদিও এই সীমাবদ্ধতা কঠোরভাবে এখনও নিয়মিত কথা বলছে, এই নিয়মকে অন্তর্ভুক্ত করে এমন একটি রেজেক্স তৈরি করা সম্ভব হবে না।
আরেকটি বিবেচনা, বিশেষত ইনপুট বৈধতার জন্য রেজিক্সগুলি ব্যবহার করার সময়, ব্যবহারকারীদের প্রতিক্রিয়া। যদি কোনও ব্যবহারকারী কোনও ভুল ঠিকানা প্রবেশ করে তবে একটি সাধারণ "সিনট্যাকটিক্যালি ভুল ঠিকানা" এর চেয়ে কিছুটা বেশি প্রতিক্রিয়া জানানো ভাল লাগবে। "ভ্যানিলা" রেজেক্সেস সহ এটি সম্ভব নয়।
এই দুটি বিবেচনা ঠিকানা ঠিকানা বিশ্লেষণ করে সমাধান করা যেতে পারে। হোস্টের নামের অতিরিক্ত দৈর্ঘ্যের সীমাবদ্ধতা কিছু ক্ষেত্রে অতিরিক্ত পরীক্ষা করে এটি পরীক্ষা করে এবং উভয় এক্সপ্রেশনগুলির সাথে ঠিকানার সাথে মিল রেখেও সমাধান করা যেতে পারে।
এই উত্তরের রেজিক্সগুলির কোনওটিই পারফরম্যান্সের জন্য অনুকূল নয়। পারফরম্যান্স যদি কোনও সমস্যা হয় তবে আপনার (এবং কীভাবে) আপনার পছন্দের রেজেক্সটি অনুকূলিত করা যায় তা দেখতে হবে।