SSブログ

正規表現の限界を広げる [コンピュータ]

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さんって、正規表現が嫌いなんだった。


nice!(0)  コメント(2)  トラックバック(0) 
共通テーマ:パソコン・インターネット

nice! 0

コメント 2

山本和彦

CPAN に IPv6 の正規表現が出てますね。参考までに。

http://search.cpan.org/~salva/Regexp-IPv6-0.02/
by 山本和彦 (2009-03-13 09:06) 

ettem

情報ありがとうございます。

そっか、正規表現を組み立てていく方法があるんですね。(途中で、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) 

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。