2018年5月13日日曜日

可能な限りRFCに準拠したEメールアドレス検証用正規表現 完全版

以前、可能な限りRFCに準拠したEメールアドレス検証用正規表現を紹介しました。

記事中にも書いてあるとおり、あの正規表現はIPアドレスを性格に判定できませんでしたが、今回その欠点を解消した完全版をお届けします。

とりあえず結果教えろ 

はい。
/^([\w!#$%&'*+\-\/=?^`{|}~]+(\.[\w!#$%&'*+\-\/=?^`{|}~]+)*|"([\w!#$%&'*+\-\/=?^`{|}~. ()<>\[\]:;@,]|\\[\\"])+")@(([a-zA-Z\d\-]+\.)+[a-zA-Z]+|\[((25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})(\.(25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})){3}|IPv6:(:(((:[\da-fA-F]{1,4}){1,7})|((:[\da-fA-F]{1,4}){0,5}:(25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})(\.(25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})){3})|:)|([\da-fA-F]{1,4}:){1}(((:[\da-fA-F]{1,4}){1,6})|((:[\da-fA-F]{1,4}){0,4}:(25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})(\.(25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})){3})|:)|([\da-fA-F]{1,4}:){2}(((:[\da-fA-F]{1,4}){1,5})|((:[\da-fA-F]{1,4}){0,3}:(25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})(\.(25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})){3})|:)|([\da-fA-F]{1,4}:){3}(((:[\da-fA-F]{1,4}){1,4})|((:[\da-fA-F]{1,4}){0,2}:(25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})(\.(25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})){3})|:)|([\da-fA-F]{1,4}:){4}(((:[\da-fA-F]{1,4}){1,3})|((:[\da-fA-F]{1,4}){0,1}:(25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})(\.(25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})){3})|:)|([\da-fA-F]{1,4}:){5}(((:[\da-fA-F]{1,4}){1,2})|:(25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})(\.(25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})){3}|:)|([\da-fA-F]{1,4}:){6}(:[\da-fA-F]{1,4}|(25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})(\.(25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})){3}|:)|([\da-fA-F]{1,4}:){7}([\da-fA-F]{1,4}|:)))\])$/
(^ω^)。。。

さらに複雑になりました。

わけわかんねー人のための解説

IPアドレス以外は前回と同じなので、IPアドレスの判定部分だけ書きます。
// IPv4
const REGEXP_COMPONENT_IPV4 = `(25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})`;
const REGEXP_DOMAIN_IPV4 = `${REGEXP_COMPONENT_IPV4}(\\.${REGEXP_COMPONENT_IPV4}){3}`;

// IPv6
const REGEXP_CHARSET_IPV6 = "[\\da-fA-F]";
const REGEXP_COMPONENT_IPV6 = `${REGEXP_CHARSET_IPV6}{1,4}`;

const REGEXP_COMPONENT_IPV6_0 = `:(((:${REGEXP_COMPONENT_IPV6}){1,7})|((:${REGEXP_COMPONENT_IPV6}){0,5}:${REGEXP_DOMAIN_IPV4})|:)`;
const REGEXP_COMPONENT_IPV6_1 = `(${REGEXP_COMPONENT_IPV6}:){1}(((:${REGEXP_COMPONENT_IPV6}){1,6})|((:${REGEXP_COMPONENT_IPV6}){0,4}:${REGEXP_DOMAIN_IPV4})|:)`;
const REGEXP_COMPONENT_IPV6_2 = `(${REGEXP_COMPONENT_IPV6}:){2}(((:${REGEXP_COMPONENT_IPV6}){1,5})|((:${REGEXP_COMPONENT_IPV6}){0,3}:${REGEXP_DOMAIN_IPV4})|:)`;
const REGEXP_COMPONENT_IPV6_3 = `(${REGEXP_COMPONENT_IPV6}:){3}(((:${REGEXP_COMPONENT_IPV6}){1,4})|((:${REGEXP_COMPONENT_IPV6}){0,2}:${REGEXP_DOMAIN_IPV4})|:)`;
const REGEXP_COMPONENT_IPV6_4 = `(${REGEXP_COMPONENT_IPV6}:){4}(((:${REGEXP_COMPONENT_IPV6}){1,3})|((:${REGEXP_COMPONENT_IPV6}){0,1}:${REGEXP_DOMAIN_IPV4})|:)`;
const REGEXP_COMPONENT_IPV6_5 = `(${REGEXP_COMPONENT_IPV6}:){5}(((:${REGEXP_COMPONENT_IPV6}){1,2})|:${REGEXP_DOMAIN_IPV4}|:)`;
const REGEXP_COMPONENT_IPV6_6 = `(${REGEXP_COMPONENT_IPV6}:){6}(:${REGEXP_COMPONENT_IPV6}|${REGEXP_DOMAIN_IPV4}|:)`;
const REGEXP_COMPONENT_IPV6_7 = `(${REGEXP_COMPONENT_IPV6}:){7}(${REGEXP_COMPONENT_IPV6}|:)`;

const REGEXP_DOMAIN_IPV6 = `(${REGEXP_COMPONENT_IPV6_0}|${REGEXP_COMPONENT_IPV6_1}|${REGEXP_COMPONENT_IPV6_2}|${REGEXP_COMPONENT_IPV6_3}|${REGEXP_COMPONENT_IPV6_4}|${REGEXP_COMPONENT_IPV6_5}|${REGEXP_COMPONENT_IPV6_6}|${REGEXP_COMPONENT_IPV6_7})`;
これだけで充分複雑ですね。

注意点

前回同様、ローカル部・ドメイン部・全体の長さの制限はチェックしていません。

0 件のコメント:

コメントを投稿