ああ、まただよ...
正規表現って、プログラミング言語間の差が少ないサブ言語なのに、なぜ「PHP」がつくとダメ正規表現ばかり登場するのか。うんざりだ。
メールアドレスは厳密にチェックしようとするとなかなか難しいのですが、簡単なチェックだったらこれでOKぽいですね。/^[^0-9][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[@][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[.][a-zA-Z]{2,4}$/
全然OKじゃない。
最初の[^0-9]
にしてからもうだめ。
メールアドレスの正規表現が一筋縄では行かないことは、ちょっとぐぐればすぐに出てくるし、しかも正規表現でマッチできるのはたかだかnobody@example.com
、すなわちaddr-spec
までで、From: Anonymous <nobody@example.com>
、すなわちmailbox
を正規表現でマッチするのは不可能なのはもう10年以上前から知られている(Perl 5.6以降の拡張正規表現であれば可能だが、それだともう狭義の正規表現からは逸脱してしまう)。
Jeffrey E. F. Friedl氏原著による 「詳説 正規表現」にはメールアドレスはネストした コメントを持つことができるので正規表現で表わすのは不可能であると 書いてあります
で、nobody@example.com
、すなわちaddr-specのみにマッチする正規表現は、以下のとおりとなる。
If you want to just check part a to see that the address is valid according to the mail header standard with a simple regular expression, you can have problems, because there are deliverable addresses that aren't RFC-2822 (the latest mail header standard) compliant, and addresses that aren't deliverable which, are compliant. However, the following will match valid RFC-2822 addresses that do not have comments, folding whitespace, or any other obsolete or non-essential elements. This just matches the address itself:my $atom = qr{[a-zA-Z0-9_!#\$\%&'*+/=?\^`{}~|\-]+}; my $dot_atom = qr{$atom(?:\.$atom)*}; my $quoted = qr{"(?:\\[^\r\n]|[^\\"])*"}; my $local = qr{(?:$dot_atom|$quoted)}; my $domain_lit = qr{\[(?:\\\S|[\x21-\x5a\x5e-\x7e])*\]}; my $domain = qr{(?:$dot_atom|$domain_lit)}; my $addr_spec = qr{$local\@$domain};Just match an address against/^${addr_spec}$/
to see if it follows the RFC2822 specification.
ちなみに、これをまとめると、
という正規表現になる。ここではコピペしやすいように、textareaタグの中に入れてある。以下、それをJavaScriptで簡易チェック。
正規表現は慣れないと使いづらいですよね。しかし使えると超絶便利。よく使うパターンを覚えておいて応用を利かせていきたいものです。
誰だって間違いはおかすし、そして今や正規表現を間違えるというのは最も間違えることの多い部分でもあり、達人でもそこから逃れるすべがほとんどない以上、間違った正規表現を見つける都度「そうじゃない」と指摘し、そして指摘されたらすぐ直し、お互いにハッピーというのが本来の作法だと私は信じている。どの言語を使っていても、その点は変わらない。
でもね....これを見てくれ。
トップにくるのは、「正規表現:メールアドレスかどうか調べる - phpspot」なのである。そしてここで紹介されている正規表現、^([a-zA-Z0-9])+([a-zA-Z0-9\._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$
は。悪名高きda.me..@docomo.ne.jp
を引っ掛ける一方で、dankogai+regexp@gmail.com
を弾いてしまう。
これでは、
と言われても無理もなくなってしまうのではないか。
GoogleはGoogleで、ペイドリンクとかはつぶさにつぶす癖に、こういうものは対策してくれないんだろうか....悪化が良貨を駆逐していく様が悪化の一途をたどる前に。
Dan the Regular Expressionist
開発者ってのは、知識のない人間が知識を持たずに使えるツールを作るべきだと思うが、肝心の開発者に知識がないんじゃ、救いようがない。プログラミングのテクニックやら正規表現ってのはソフトウェアの利用者でなく開発者のためにあるモノで、その情報の真偽も調べずに使う開発者が一番いただけないと思う。そういう開発者こそ糾弾されるべきで、改善されるべきは彼らだ。
たとえその情報が間違っていたとしても、善意で情報を公開している人間に暴言を吐く事に、暴言を吐いた人間のストレス発散以上の価値があるだろうか。ないよね。
せっかく知識があるのに、こういう形で公開しちゃうなんて非常にもったいないと思うが、今更こんなコメント、読んでないよね。