正規表現の限界を広げる

kazuさんが正規表現を超えるって書いているけど、正規表現に限界があるのは周知の事実じゃないのかな。

結局のところ、程度の問題なんじゃないかな。正規表現でどこまで複雑な事ができるかってのが問題なだけだ。

IPv4アドレスの解析を例に挙げているけど、調べてみると、以下のように書ける。


m{
^ ( \d | [01]?\d\d | 2[0-4]\d | 25[0-5] )
\. ( \d | [01]?\d\d | 2[0-4]\d | 25[0-5] )
\. ( \d | [01]?\d\d | 2[0-4]\d | 25[0-5] )
\. ( \d | [01]?\d\d | 2[0-4]\d | 25[0-5] )
$
}x

この程度なら、再利用云々を気にしないでも良いと思し、こんな事のために、いくつも関数を定義したくない。

「じゃあ、IPv6は?」ってなると、うーん... 例え書けたとしても、読めたものではないと思う。上記の正規表現Perl拡張正規表現を使っているから読む気になるだけで、POSIX正規表現で書かれていたら読みたくない。

では、どうであれば良いのかと言うと、\d+の部分に、プログラマーが定義した、真偽を返す関数を書ければ良いのではないだろうか。例えば、こんな感じで書けるといいな。


/^\digitByte\.\digitByte\.\digitByte\.\digitByte$/

ここでは、digitByteは、プログラマーが定義した、文字列を受け取って0〜255の範囲の数かどうかを判定する関数としています。こういうのは、もはや正規表現とは言えず、新たな記法になるかもしれないけど。

こんな事ができる言語処理系があればいいな。Rubyか、Gaucheでやってくれないかな。

そういや、kazuさんって、正規表現が嫌いなんだった。