弊社は毎週一回、社内で技術勉強会をやっているのですが
今日の発表者は僕だったので、正規表現の基本についてレクチャーしました。
で、例題として『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が正しくマッチすることは確認済みですが、
マッチしてはいけないものに正しくマッチ失敗するかは、簡単なものしか試していない。
(悪魔の証明はできません)
田中哲スペシャルが使えればいいのに。ううう。
あ、『もっと短いのがあるよ!』
があったら教えて下さいませ。ラーメン一杯くらいおごります。いやマジで。
ちなみに
*1: これを書いた人はネタで書いてます