見出し画像

IPアドレスの正規表現を分解して基礎を理解する

こんにちは。ぐらりです。
今回はなんとなく理解しないまま放置していた正規表現について。例えば、Googleアナリティクスで特定のIPからのアクセスを除外したいとき、フィルタ設定で該当のIPからのトラフィックを除外することが可能ですが、複数IPを指定したい場合は正規表現でフィルタパターンを設定されるケースがあると思います。

Googleアナリティクスのヘルプページを引用すると、下記のように正規表現を利用して任意のトラフィックを除外することができます。

画像1

正規表現の解読

ここで使われている正規表現を見てみます。

^192\.100\.0\.1$|^192\.168\.0.*$

画像3

「\」・・・バックスラッシュ
バックスラッシュは、続く文字を文字通りに解釈する必要があることを知らせるシグナル。
正規表現で特殊文字として扱われるドット「.」を、バックスラッシュを前に置いて特殊文字として解釈させないようにし、文字通りにIP アドレスの小数点区切りとして認識させるために使用している。

「^」・・・キャレット
後ろに隣接する文字が文字列の先頭である場合に一致。
「$」・・・ドル記号
直前の隣接する文字が行末にある場合に一致。
⇒これにより「192.100.0.1」に行頭末尾が一致するIPアドレスが指定される。

「|」・・・パイプ
OR条件を指定できる正規表現。
これにより「192.100.0.1 ”と” 192.168.0 のサブネット」のいずれかでに一致するよう指定している。

「.*」・・・ドットとアスタリスク
任意の一文字に一致する「.」と、直前の文字が 0 回以上繰り返される場合に一致する「*」の組み合わせを使用するとワイルドカードの意味を持ち、行頭と行末に同じ文字を含むすべての文字列に一致。
つまり「192.168.0」から始まって終わるすべてのIPアドレスに一致する。
※IPアドレスのサブネットの意味を正確に理解していないのでざっくりした解釈です。

まとめと応用

●行頭末尾まで一致させたい場合は「^一致させたい文字$」のように「^」と「$」をセットで使うべし。
※IPアドレスから少し離れるが、これらの文字は次のような場合にも活用できる。
例えばトップ直下にある/product/配下に含まれるパスを指定したいが、「/product/○○」というURLと、「/○○/product/」というURLが存在する場合。「/product/」と指定しただけでは上記いずれのURLも抽出されてしまうが「^/product/」と指定することで、行頭が「/product/」であるもの(つまりトップ直下の該当パス)に絞り込むことができる。

●AまたはBまたはCなどOR条件をしているする場合は「A|B|C」のように「|」を使うべし。

●IPアドレスの「.」は正規表現だと特殊文字と判定されてしまうので「\」で”そうじゃないよ、IPアドレスの小数点だよ”と指令を送るすべし。

●「.*」は範囲指定に使いやすい。

直前の項目以外も一致する必要がある場合は、アスタリスクとドット(.*)を組み合わせます。ドットは直前の任意の項目と一致し、アスタリスクはその項目を 0 回以上繰り返します。この組み合わせを使うと、行頭と行末に同じ文字を含むすべての文字列(URI など)に一致します。行頭と行末の間に文字が何文字あってもかまいません。たとえば、/mens/.*html は次と一致します。
/mens/shirts/oxford.html
/mens/shirts/oxford/shortsleeve.html


ここまで、IPアドレスを正規表現で記述する際のサンプルを紐解くことで、基本的な正規表現(の一部だが)のルールや意味は理解できたので、IPアドレスの記述のほか、任意の指定や検索時にも応用していきたいと思う。

なお、IPアドレスを範囲指定したい場合に正規表現に変換してくれる便利なツールもあるようなので備忘も兼ねて掲載。範囲指定でなくても、複数のIPアドレスそれぞれの正規表現を取得し、OR条件でつなげるような活用方法もできそうだ。
https://www.analyticsmarket.com/freetools/ipregex

この記事が気に入ったらサポートをしてみませんか?