本邦初公開!電話番号の正規表現 - にぽたん研究所

March 29, 2005

このエントリーをはてなブックマークに追加
近年「本邦初公開」って表現、あんま使わないすね。。。

さて、Regexp::Assemble という、正規表現愛をものすごく感じるモジュールを見付けました。
愛がある上に、ものすごく便利です。
use strict;
use Regexp::Assemble;

my $ra = Regexp::Assemble->new;
$ra->add('a');
$ra->add('b');
print $ra->re, "\n";
みたいなのを書くと、
(?-xism:[ab])
という結果になる。
要は、add() メソッドに渡した文字列や正規表現の全てにマッチする正規表現を作ってくれるスグレモノ。
(?-xism:) というのは前にも書きましたが quote regex 演算子を使ったために付加される「クロイスタ」です。
この結果に対しては、クロイスタは別に無くても構わないので、実質
[ab]
ということになります。

もちろん、add() メソッドにガシガシ入れていけば、どんどん複雑な正規表現を作ってくれるわけです。
これが Pure Perl で書かれているってのが何よりスゴイ。。。
こんなに正規表現愛を感じるモジュールがやまだかつてあったでしょうか。

ところで、日本の電話番号の validation が行なえる、Number::Phone::JP という、これまた正規表現愛を感じるモジュールが存在するのですが、この二つを融合させて、日本の電話番号にマッチする正規表現というのを作ってみました。
市外局番と、それ以下の番号をハイフンで結合した場合にマッチする正規表現は、こうなります。



^0(?:8(?:0(?:0-(?:0(?:00|80)|1(?:00|11|2[03]|70)|2(?:00|22)|
3(?:00|3[3-9]|[4-9]\d)|4(?:00)|5(?:00|5[5-9]|[6-9]\d)|6(?:00
|4[1-9]|[5-9]\d)|7(?:00|77)|8(?:00|88)|9(?:00|19|2[4-9]|[3-9
]\d))\d{4}|-(?:1(?:[0127]\d|3[0-2]|4[0-7]|6[0-27-9]|8[0-57-9
]|9[0-59])|3(?:[01]\d|2[0-8]|3[89]|4[0-5]|6[1-4]|7[46-9]|8[0
78]|9[24])|5(?:0\d|1[01]|2[0-3]|4[0-6]|5[58]|60|7[01]))\d{5}
)|4(?:7(?:[78]-[1-9]\d{4}|-[1-9]\d{5})|6(?:6-[1-9]\d{4}|-[1-
9]\d{5})|8(?:7-[1-9]\d{4}|-[1-9]\d{5})|52-[1-9]\d{4}|-[1-9]\
d{6})|6(?:3(?:6-[1-9]\d{4}|-[1-9]\d{5})|9(?:9-[1-9]\d{4}|-[1
-9]\d{5})|[5678]-[1-9]\d{5}|-[1-9]\d{6})|3(?:8(?:[78]-[1-9]\
d{4}|-[1-9]\d{5})|[234567]-[1-9]\d{5}|9[56]-[1-9]\d{4}|-[1-9
]\d{6})|8(?:7(?:4-[1-9]\d{4}|-[1-9]\d{5})|[0349]-[1-9]\d{5}|
5[34]-[1-9]\d{4}|-[1-9]\d{6})|5(?:[23456789]-[1-9]\d{5}|1[24
]-[1-9]\d{4})|9(?:[2345678]-[1-9]\d{5}|-[1-9]\d{6})|2(?:[034
679]-[1-9]\d{5}|-[1-9]\d{6})|7(?:[579]-[1-9]\d{5}|-[1-9]\d{6
}))|1(?:6(?:5(?:3(?:[24]-[1-9]\d{3}|-[1-9]\d{4})|2(?:8-[1-9]
\d{3}|-[1-9]\d{4})|[4568]-[1-9]\d{4})|4(?:[68]-[1-9]\d{4}|-[
1-9]\d{5})|3[24568]-[1-9]\d{4}|[267]-[1-9]\d{5})|5(?:8(?:2(?
:9-[1-9]\d{3}|-[1-9]\d{4})|[4678]-[1-9]\d{4})|[345](?:[78]-[
1-9]\d{4}|-[1-9]\d{5})|2(?:[27]-[1-9]\d{4}|-[1-9]\d{5})|6[24
6]-[1-9]\d{4}|7-[1-9]\d{5})|2(?:0-(?:[0-8]\d\d|9(?:[09]\d|1[
0129]|2[02]|3[039]|4[01]|5[056]|6[0369]|7[079]|8[0126-9]))\d
{3}|6(?:7-[1-9]\d{4}|-[1-9]\d{5})|[35]-[1-9]\d{5}|42-[1-9]\d
{4})|4(?:5(?:[467]-[1-9]\d{4}|-[1-9]\d{5})|6(?:6-[1-9]\d{4}|
-[1-9]\d{5})|[234]-[1-9]\d{5})|3(?:(?:9[245678]|7[24678])-[1
-9]\d{4}|[34568]-[1-9]\d{5})|7(?:[2345689]-[1-9]\d{5}|-[1-9]
\d{6})|9(?:[1234578]-[1-9]\d{5}|-[1-9]\d{6})|8(?:[234567]-[1
-9]\d{5}|-[1-9]\d{6})|1-[1-9]\d{6})|5(?:0-(?:1(?:[0-4]\d\d|5
(?:[0-6]\d|7[0-7]))|2(?:0(?:0\d|1[0-6])|40[0-8]|525)|3(?:0(?
:[0-3]\d|4[0-5])|3\d\d|4(?:[0-4]\d|50)|90[01])|5(?:00[0-3]|2
0[012]|5(?:[012456]\d|3[012]))|6(?:619|620)|7(?:00[01]|10[0-
6]|5(?:[012]\d|3[012]))|8(?:00[0-6]|600|800))\d{4}|7(?:0-(?:
0\d\d|1(?:0[012]|11)|2(?:22)|3(?:00|33)|5(?:00|55|7[012])|6(
?:00)|7(?:00|77)|8(?:0\d|8[128])|9(?:[19]9))\d{3}|6(?:9-[1-9
]\d{4}|-[1-9]\d{5})|[23457]-[1-9]\d{5}|8-[1-9]\d{4})|9(?:7(?
:[49]-[1-9]\d{4}|-[1-9]\d{5})|[345689]-[1-9]\d{5}|-[1-9]\d{6
})|5(?:[01345678]-[1-9]\d{5}|-[1-9]\d{6})|3(?:[1236789]-[1-9
]\d{5}|-[1-9]\d{6})|8(?:[134567]-[1-9]\d{5}|-[1-9]\d{6})|4(?
:[34578]-[1-9]\d{5}|-[1-9]\d{6})|6[123456789]-[1-9]\d{5}|2-[
1-9]\d{6})|9(?:9(?:(?:0-(?:203|3(?:0[0589]|1[0-3589]|2[01359
]|3[023478]|4[049]|8[02])|5(?:[0-48]\d)|6(?:[0-48]\d)|7(?:0[
037]|40))|1[23]-[1-9])\d{4}|6(?:9-[1-9]\d{4}|-[1-9]\d{5})|[3
457]-[1-9]\d{5}|-[1-9]\d{6})|8(?:0(?:2-[1-9]\d{4}|-[1-9]\d{5
})|[234567]-[1-9]\d{5}|-[1-9]\d{6})|4(?:9(?:6-[1-9]\d{4}|-[1
-9]\d{5})|[0234678]-[1-9]\d{5})|5(?:[0245679]-[1-9]\d{5}|-[1
-9]\d{6})|6(?:[456789]-[1-9]\d{5}|-[1-9]\d{6})|7(?:[234789]-
[1-9]\d{5}|-[1-9]\d{6})|[23](?:0-[1-9]\d{5}|-[1-9]\d{6})|0-[
1-9]\d{7})|7(?:4(?:7(?:[23]-[1-9]\d{4}|-[1-9]\d{5})|3(?:9-[1
-9]\d{4}|-[1-9]\d{5})|4(?:3-[1-9]\d{4}|-[1-9]\d{5})|6[34568]
-[1-9]\d{4}|[02589]-[1-9]\d{5})|7(?:9(?:7-[1-9]\d{4}|-[1-9]\
d{5})|[0123468]-[1-9]\d{5}|-[1-9]\d{6})|0-(?:5\d\d|6(?:1\d|2
[0-8]|3[0-6]|[456]\d|7[0125]|9[4-9]))\d{5}|9(?:[012456789]-[
1-9]\d{5}|3[23]-[1-9]\d{4}|-[1-9]\d{6})|6(?:[135678]-[1-9]\d
{5}|-[1-9]\d{6})|3(?:[56789]-[1-9]\d{5}|-[1-9]\d{6})|2(?:[14
59]-[1-9]\d{5}|-[1-9]\d{6})|[58]-[1-9]\d{6})|2(?:5(?:4(?:9-[
1-9]\d{4}|-[1-9]\d{5})|[056789]-[1-9]\d{5}|-[1-9]\d{6})|9(?:
5(?:7-[1-9]\d{4}|-[1-9]\d{5})|[134679]-[1-9]\d{5}|-[1-9]\d{6
})|0-(?:4(?:[0246]\d|1[0-79]|3[014-9]|9[29]))\d{5}|6(?:[0134
56789]-[1-9]\d{5}|-[1-9]\d{6})|4(?:[01234678]-[1-9]\d{5}|-[1
-9]\d{6})|8(?:[02345789]-[1-9]\d{5}|-[1-9]\d{6})|2(?:[034568
9]-[1-9]\d{5}|-[1-9]\d{6})|7(?:[046789]-[1-9]\d{5}|-[1-9]\d{
6})|3(?:[34578]-[1-9]\d{5}|-[1-9]\d{6}))|4(?:9(?:9[2468]-[1-
9]\d{4}|[345]-[1-9]\d{5}|-[1-9]\d{6})|6(?:[3567]-[1-9]\d{5}|
0-[1-9]\d{4}|-[1-9]\d{6})|7(?:[05689]-[1-9]\d{5}|-[1-9]\d{6}
)|2(?:[2468]-[1-9]\d{5}|-[1-9]\d{6})|3(?:[689]-[1-9]\d{5}|-[
1-9]\d{6})|8(?:0-[1-9]\d{5}|-[1-9]\d{6})|[45]-[1-9]\d{6}|-[1
-9]\d{7})|0(?:91(?:9[12389]|2[0123]|8[018]|4[45]|5[56]|30)|3
[123456789]|7[012345678]|6[01234567]|8[01234689]|4[123456]|5
\d|1)-\d+|[36]-[1-9]\d{7})$


恐らく、日本の電話番号にマッチする正規表現を公開したサイトは、ここが初めてではないでしょうか。

ということで、この正規表現を RegExLib.com に登録してやろうかと思い、フォームに入力して submit したら、Matching examples must be matched by this expression. と怒られてしまった。。。
いや、これ、マッチしますって。。。
なんか腹立つ…。


ちなみに、Regexp::Assemble が正しい正規表現を返すかどうかや、Number::Phone::JP の正規表現が今日現在でも正しいのかどうか等、未検証部分が異常に多いので、自己責任でお使いくださいw

nipotan at 21:33 | Comments(0) | TrackBack(5) | 技術 
このエントリーをはてなブックマークに追加

Trackback URL for this entry

Trackbacks

1. Regexp::Assemble  [ blog.bulknews.net ]   March 30, 2005 20:51
本邦初公開!電話番号の正規表現 - にぽたん研究所 さて、Regexp::Assemble という、正規表現愛をものすごく感じるモジュールを見付けました。 愛がある上に、ものすごく便利です。 このモジュール、すごいですね。マッチするテキストをどんどん追加していくと、それにマッチ
2. Regexp::*  [ 404 Blog Not Found ]   March 30, 2005 21:54
Rexexp::Optimizerの方もよろしこ。 にぽたん研究所 さて、Regexp::Assemble という、正規表現愛をものすごく感じるモジュールを見付けました。 愛がある上に、ものすごく便利です。 Dan the JAPH
3. 日本の電話番号を正規表現で書く  [ きらきら☆Perl ]   August 07, 2005 16:38
「正規表現とは何か?」という説明から必要なのかもしれないのですが、いきなりぶっとびます。 Perlになじみのある方なら(どのくらいなじんでるかはちょっとおいといて)、正規表現も避けては通れないんで(たぶん)、はしょっても(省略しても)大丈夫ですか?(と勝手...
4. Shibuya.pm Teck Talk #7  [ Nowhere Near ]   October 22, 2006 15:25
Shibuya.pm Teck Talk #7 に行ってきました。Shibuya...
5. 二度目の公開!電話番号の正規表現  [ にぽたん研究所 ]   February 15, 2007 22:50
※ 二度目の公開というタイトルにしましたが、三度目は予定していません。 2 年ぐらい前に、本邦初公開!電話番号の正規表現というネタで、Regexp::Assemble という CPAN モジュールを紹介したことがありました。 あのモジュールを使うことによって、日本で初めて、電話番....

Post a comment

Name:
URL:
  Remember info?: Rate: Face    Star