- masaya fukuda
- Jun 21, 2018
- Tags
正規表現、最初のとっかかり。第二回
「正規表現」について。今回はIPアドレス等数字部分を考えてみました。
■奥が深い正規表現
前回名前のマスキングということで姓と名にあたる部分を正規表現で拾って「XXX,XXX」で置換するという例で紹介しましたが、もちろん他にもいろいろな使い方が正規表現にはあります。
名前の次にログにマスキングを行う際によく対象となるのはIPアドレスです。
今回はIPアドレスを正規表現で置換するパターンを考えてみましょう。
■IPv4アドレスで考えてみる
IPアドレスと言ってもIPv4アドレス・IPv6アドレスと大きく二つあると思いますが、今回はIPv4アドレスで考えていきたいと思います。
何故IPv4アドレスで考えていくのかというと、数字だけだからです。
今回は数字だけのものを正規表現で拾っていきたいと思います。
まずIPv4アドレスですが、
・0.0.0.0~255.255.255.255で指定される
この点で考えていきたいと思います。
数字(最大3文字)、「.」、数字(最大3文字)、数字(最大3文字)、「.」、数字(最大3文字)、「.」、数字(最大3文字)となっていますので、まずは数字の部分について考えていきます。
一番小さな値でも0.0.0.0なので、必ず1文字は指定されますが、2文字目、3文字目は存在しないこともあります。
前回使ったものを組み合わせて「.*\..*\..*\..*」といったものでも拾うことができますが、広範囲で拾ってしまうため、必要以上のものまで拾ってしまいます。
「aaa.bbb.ccccc.dddddd」といったもの、「1.2.3.4 localhost」なんてものもすべてマスキングする際に巻き込むことになるのでよろしくない正規表現となります。
3文字と分かっているのだから、「...\....\....\....」とする方法もあります。
こちらは3文字指定を行っているため、先ほどのものよりは正確にIPアドレスを拾うことができます。しかし、「a11.123.111.111」といった数字以外が含まれたものも拾えてしまいます。
そこで今回は「数字であるもの」のみを拾うように指定をしたいと思います。
数字は0から9になりますので、それをしっかり指定するわけです。
指定した文字のどれかといった条件は[]になります。
[0123456789]とすれば数字であるものを拾うことができますので、以下できちんとIPアドレスを拾うことができます。
「[0123456789][0123456789]*[0123456789]*\.[0123456789][0123456789]*[0123456789]*\.[0123456789][0123456789]*[0123456789]*\.[0123456789][0123456789]*[0123456789]*」
これを[0-9]という書き方で省略することもできます。
「[0-9][0-9]*[0-9]*\.[0-9][0-9]*[0-9]*\.[0-9][0-9]*[0-9]*\.[0-9][0-9]*[0-9]*」
少しスッキリしました。なぜ「*」が入っているんだ?と思われる方は「*」の効果を思い出してください。「直前の文字の0個以上の並び」ですので、直前の文字を省略することができるわけです。それで1文字の数字だけでも拾うことができます。
■最後に
いくら便利といってもやはり使う機会がなければ覚えようという気にはならないでしょう。しかし、いざ使う時が来た際に「正規表現」という言葉が出てくるようになればそれだけでも違うのではないかと思います。
Comments
Add your comment