正規表現の限界を広げる [コンピュータ]
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さんって、正規表現が嫌いなんだった。
CPAN に IPv6 の正規表現が出てますね。参考までに。
http://search.cpan.org/~salva/Regexp-IPv6-0.02/
by 山本和彦 (2009-03-13 09:06)
情報ありがとうございます。
そっか、正規表現を組み立てていく方法があるんですね。(途中で、forの中身を追いかけるのを断念してしまいましたけど。)
そうすると、IPv4の場合は、
$byte = "\\d|[01]\\d\\d|2[0-4]\\d|25[0-5]";
$IPv4 = "$byte\\.$byte\\.$byte\\.$byte";
$exactIPv4 = "^$IPv4\$";
と、定義を再利用すればOK?
by ettem (2009-03-13 22:38)