March 29, 2005
近年「本邦初公開」って表現、あんま使わないすね。。。
さて、Regexp::Assemble という、正規表現愛をものすごく感じるモジュールを見付けました。
愛がある上に、ものすごく便利です。
要は、
この結果に対しては、クロイスタは別に無くても構わないので、実質
もちろん、
これが Pure Perl で書かれているってのが何よりスゴイ。。。
こんなに正規表現愛を感じるモジュールがやまだかつてあったでしょうか。
ところで、日本の電話番号の validation が行なえる、Number::Phone::JP という、これまた正規表現愛を感じるモジュールが存在するのですが、この二つを融合させて、日本の電話番号にマッチする正規表現というのを作ってみました。
市外局番と、それ以下の番号をハイフンで結合した場合にマッチする正規表現は、こうなります。
さて、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