読者です 読者をやめる 読者になる 読者になる

この日記は私的なものであり、所属会社の見解ではありません。 GitHub: takahashikzn

IPv4にマッチする正規表現

Regex

弊社は毎週一回、社内で技術勉強会をやっているのですが
今日の発表者は僕だったので、正規表現の基本についてレクチャーしました。


で、例題として『IPv4にマッチする最短の正規表現』を考えたのですが、とりあえずは、

((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])[.]){3}(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])

という平凡なものしか思いつきませんでした。これって、

(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])

という長いパターンが2回出てくるのがイヤな感じなのですが、
ググッてみても皆さん同じような感じのモノを使っているようで。

もっとオシャレに書けないかねぇ。。。

と暫く考えてみたところ、思い付いたのがコレ。

((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])([.](?!$)|$)){4}

一応説明しときますと、これは

0から255までの数値文字列→
\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]
[.](?!$)→
次の文字が行末でないドット


ですので、つまり

『0から255までの数値の直後に"行末でないドット"または"行末"』を4回繰り返す

という意味になります。


但し本当にこれで正しいのか、ちょっと自信がない。

勿論、xxx.xxx.xxx.xxxが正しくマッチすることは確認済みですが、
マッチしてはいけないものに正しくマッチ失敗するかは、簡単なものしか試していない。
(悪魔の証明はできません)


田中哲スペシャルが使えればいいのに。ううう。


あ、『もっと短いのがあるよ!』
があったら教えて下さいませ。ラーメン一杯くらいおごります。いやマジで。

ちなみに

"正規表現 IPv4"でぐぐったらこれを発見。
何だか微笑ましい気持ち*1になりました。

2012-07-31追記

上記リンクがリンク切れになっているようですが、

[0-255].[0-255].[0-255].[0-255]

みたいな感じだったはず(※この正規表現はネタですのでご注意を)

*1: これを書いた人はネタで書いてます